使用rust开发的高性能python压测工具
Project description
atomic-bomb-engine-py
atomic-bomb-engine的python包装实现
前端仓库
atomic-bomb-engine-front
使用条件:
- python版本 >= 3.8
- windows(x86), linux(x86), mac
使用方法:
-
准备开始
通过pip安装 (0.5.0版本之前)
pip install atomic-bomb-engine-py
在python中引用时注意,需要引用atomic_bomb_engine, 而不是atomic_bomb_engine_py
为了避免混淆,0.5.0版本之后,pip更换了包名,更改为atomic-bomb-engine,
pip install atomic-bomb-engine
在python中导入
import atomic_bomb_engine
异步使用的时候,还需要引用asyncio
import asyncio
-
开始压测
-
单接口压测(功能与多接口压测重叠,已废除) -
多接口压测
-
多接口压测可以使用batch_async方法进行操作,函数签名和解释如下
async def batch_async(
test_duration_secs: int,
concurrent_requests: int,
api_endpoints:List[Dict],
step_option:Dict[str, int]|None=None,
setup_options:List[Dict[str, Any]]|None=None,
verbose:bool=False,
should_prevent:bool=False,
assert_channel_buffer_size:int=1024,
timeout_secs=0,
cookie_store_enable=True
) ->Dict:
"""
批量压测
:param test_duration_secs: 测试持续时间
:param concurrent_requests: 并发数
:param api_endpoints: 接口信息
:param step_option: 阶梯加压选项
:param setup_options: 初始化选项
:param verbose: 打印详细信息
:param should_prevent: 是否禁用睡眠
:param assert_channel_buffer_size: 断言队列buffer大小
:param timeout_secs: http超时时间
:param cookie_store_enable: 是否为客户端启用持久性cookie存储。
"""
使用assert_option方法可以返回断言选项字典
assert_options=[
atomic_bomb_engine.assert_option("$.code", 429),
atomic_bomb_engine.assert_option("$.code", 200)
])
jsonpath如果不会用的话,建议去jsonpath学习
使用step_option方法可以返回阶梯加压选项字典
def step_option(increase_step: int, increase_interval: int) -> Dict[str, int]:
"""
生成step option
:param increase_step: 阶梯步长
:param increase_interval: 阶梯间隔
"""
同样的本包中也包含了一个对api_endpoint的包装:endpoint方法,方便调用,endpoint中的assert_options中也可以套用assert_option方法
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
监听时可以使用BatchListenIter生成器
async def listen_batch():
iterator = atomic_bomb_engine.BatchListenIter()
for message in iterator:
if message:
print(message)
else:
await asyncio.sleep(0.3)
压测+同时监听
async def main():
await asyncio.gather(
run_batch(),
listen_batch(),
)
if __name__ == "__main__":
asyncio.run(main())
压测时使用ui界面监控
0.5.0版本后,添加了ui页面,支持批量压测方法
导入
from atomic_bomb_engine import server
使用
import asyncio
import atomic_bomb_engine
from atomic_bomb_engine import server
@server.ui(port=8000)
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
if __name__ == '__main__':
asyncio.run(run_batch())
使用server.ui装饰器,可以给批量压测方法启动一个简单的web服务器,不需要再手动监听BatchListenIter生成器
内部架构图
[0.19.0] - 2024-04-16
Added
- 增加了初始化和参数模版功能
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)]
上述实例展示了如何在初始化的时候调用某个接口,并且通过jsonpath将数据提取出来,保存在全局变量test-msg和test-code中 提取完全局变量后,就可以在后续的api_endpoints中使用
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
]
上述实例展示了如何在请求中使用全局变量,使用双大括号即可使用
Fixed
- 修复了如果http状态码错误时,不会记录
- 修复了json反序列化的问题
[0.20.0] - 2024-04-17
Added
断言更改为异步生产消费,提升性能
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
[0.22.0] - 2024-04-18
Added
前端进行了性能优化
[0.24.0] - 2024-04-22
Added
异步断言使用了补偿消息,保证消息的一致性
[0.25.0] - 2024-04-23
Added
在endpoints中增加思考时间,模拟用户行为
think_time_option(min_millis=200, max_millis=300)
- min_millis:最小思考时间(毫秒)
- max_millis:最大思考时间(毫秒)
使用时在endpoint中增加think_time_option参数
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-1",
url="http://localhost:8080/a",
method="POST",
weight=1,
timeout_secs=10,
json={"name": "{{test-msg}}", "number": "{{test-code}}"},
think_time_option=atomic_bomb_engine.think_time_option(min_millis=200, max_millis=300),
),
]
[0.26.0] - 2024-04-24
Added
- 增加endpoint中的setup,在并发中可以做接口断言
- 增加有关联条件下的cookie自动管理功能
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
)
- 参数cookie_store_enable控制是否自动管理cookie,前置条件的cookie会带入到最终的压测接口中
- 在endpoint中使用setup_options可以传入多个接口,并且提取参数
- 提取到的参数如果和全局的setup的key冲突,会覆盖全局提取到的参数
- 接口中提取的参数只能在本线程(v-user)中使用
- ⚠️ 使用时注意:setup_options是顺序执行的,没有并发,但是相当于添加了think time
[0.28.0] - 2024-04-25
Added
- 将持久化cookie添加到全局选项中
- 复用http client
- 选择性开启断言任务
- 接口初始化时出现错误等待后重试##
[0.29.0] - 2024-04-25
Added
- 优化并发逻辑
- 前端更改为web worker发送心跳
[0.38.0] - 2024-05-7
Added
- 增加附件上传功能
- 在初始化和每个接口中增加了multipart_options参数用于附件上传
- 增加multipart_option方法封装附件参数
- form_key: form表单的key
- path: 附件路径
- file_name: 附件名
- mime: 附件类型 (类型可以参考这里)
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-file",
url="http://127.0.0.1:8888/upload",
method="post",
weight=100,
multipart_options=[atomic_bomb_engine.multipart_option(form_key="file", path="./ui.py", file_name="ui.py", mime="text/plain")],
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.message", reference_object="File uploaded successfully!"),
],
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),]
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
TODO
- 前端展示页面 ✅
- 接口关联 ✅
- 每个接口可以配置思考时间 ✅
- 增加form支持 ✅
- 增加代理支持
- 增加附件支持 ✅
- 断言支持不等于等更多表达方式
联系方式
- 邮箱:qyzhg@qyzhg.com
- 微信:qy-zhg
👏🏻👏🏻👏🏻欢迎加群交流
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Hashes for atomic_bomb_engine-0.38.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 08dcc215bcd6e54225f037a16033875988582841b6f337ec25b9816cd943b551 |
|
MD5 | c55086885ed7cd2ff5ae6362c720a066 |
|
BLAKE2b-256 | 1c1396283904dc477c5a866b7631cbe6d991dd7976dd751ab435555a1fe065d0 |
Hashes for atomic_bomb_engine-0.38.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 93c2bde4cbb7040252474aa78c583b74eb84cb1c5c10ead8ee1fc96091ade72e |
|
MD5 | 3259b43823eecc584abae0bff73924c9 |
|
BLAKE2b-256 | 963836ea4903463c0619557a4dbf90a8a23bbd7c133fe7abbd09a5f43917c575 |
Hashes for atomic_bomb_engine-0.38.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f89f58d770868eaaadc506920e4b9a07c5ecf2738de2a93ddc47be0e9af801f3 |
|
MD5 | 019a34fdb0e4d135a6cbf7a9a19505e1 |
|
BLAKE2b-256 | 02c3edf85917b92fd43006d1fd71fb4d828af842d587f254e801e951ae6594b8 |
Hashes for atomic_bomb_engine-0.38.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c6a394d0fda75c6bbf290c2afa3e7b1d3100b994d51c7ec9f7534c2b29befa58 |
|
MD5 | 60df6cd0abee8b2f5f360bf1aca1c670 |
|
BLAKE2b-256 | 303d97bb9ac99fe15aaf2320a7bf4dc33b11ea66402a7c8bf52dd880ba1f9a16 |
Hashes for atomic_bomb_engine-0.38.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 97b7a20fd741d9d1feec8cfa2588a17d268750bc98f6a507a8042870cf198906 |
|
MD5 | 42913cea81e071147829f68629f907b2 |
|
BLAKE2b-256 | d30b0997433802fddfecbb78bcd14df21749adc3795d5d46f40702eb8e6f1664 |
Hashes for atomic_bomb_engine-0.38.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4f1c4c1069c145567ff9e1346a9c20b3812f197eca41a717f245a14c6c9da3a2 |
|
MD5 | fdfeccbe6d391cc0cf5e0abd161055b3 |
|
BLAKE2b-256 | e7d09aeed9f5cfcbb03c492d26756905462a46ce765f6f5f0cdb2d00ed9874c6 |
Hashes for atomic_bomb_engine-0.38.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7010d281a986f26086701335ac25efdabc175a0aa3771be6303baac0fff223ab |
|
MD5 | 5a9ede978263aae6118ebaad9867f6ec |
|
BLAKE2b-256 | 2b4e0dcb16d0cdea11c1eff26bd8efe022791dcac77aadf7504eb1c3a65a6c24 |
Hashes for atomic_bomb_engine-0.38.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9a4d22dbc0935358f3df96b00ce3a85264178dc2f3b9800c4cd4c0f3f57d35f8 |
|
MD5 | 3be26d81f1b275e42438ea28bc5386a0 |
|
BLAKE2b-256 | e608fe96aff6d7196c98eb3e3138bbe65ea5d6cd5e4f728fd1f412d90f279680 |
Hashes for atomic_bomb_engine-0.38.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37d380795d7c72949fa1058f563353d2fcad3bda305a650575501cc68fcceeb8 |
|
MD5 | f2da7b06ffbb7e0200ac39c5fd463b70 |
|
BLAKE2b-256 | 7bc25150d6add71a0ebfdfc94ad21c61ff10a6e1bea92672f9f6fc19c5b28912 |
Hashes for atomic_bomb_engine-0.38.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 68403aa9ef22f47ad2131579e0842a9cb739b760bab201ca93eb6284e50b199f |
|
MD5 | 6523f95c4d2ed2bc30448fba4e620461 |
|
BLAKE2b-256 | 78e7130e90addf19633e95d316906cbba2960d1489d662b7132ab1f9655e06e7 |
Hashes for atomic_bomb_engine-0.38.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 397baef5304d196c34f4712c75a6f3cad10a499e1e3374110f33d71edf42db8f |
|
MD5 | 92e552625e930574dffd61fda455ba8c |
|
BLAKE2b-256 | 7d9c4e83f5e4b5c80e16971acc6bccb241845d69698bd1f5ab7d780c4f9488df |
Hashes for atomic_bomb_engine-0.38.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 48bcf3d3c75cd0276879ca1c7b7c1823d02d591ae0e186801947c7628251067c |
|
MD5 | d547c2327c01e804be47d37d41d8c18c |
|
BLAKE2b-256 | 16d2eb2cabdb8f9a097fd5740c45929dd3035c410d291cff88feb0e0d9209984 |
Hashes for atomic_bomb_engine-0.38.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3ce35b6911079dba8b7d45ebc93c110651ce1a18eaf12a0f304f4f12dd22e2fe |
|
MD5 | 510c2fc1ab981b5c9bd258d8be751cbb |
|
BLAKE2b-256 | a337090f6db08d70a03bc0883837a890d0ba2e6878e957f7975fa3daf3398044 |
Hashes for atomic_bomb_engine-0.38.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84516f1c5e2146f63c77a508d6cab63961761a7294ced2ef68dc23136c1801f1 |
|
MD5 | bd4b3252fc82576a5ebac8a890e3946e |
|
BLAKE2b-256 | e97fe2c060eb8f54430e4b789c7a6e7ca9a8fd2f134cd49a4390a3753166dcb7 |
Hashes for atomic_bomb_engine-0.38.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e6abcbb22459c0a1f7db350caf45180a90312ccc0d1f493b486e8c7dd6818b7e |
|
MD5 | c2fb80f9e6adfc6467e277c86d93be70 |
|
BLAKE2b-256 | ee85302065079c1dc5513dd1e7d91c3799ea704c55375acb7da57b917c2ab876 |
Hashes for atomic_bomb_engine-0.38.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e2e7aff3b0d151108e16dd34397efb0741568616df0732220b2d255e1192bdcc |
|
MD5 | 6f0ad9ae96c564ec6f6a9294747ef995 |
|
BLAKE2b-256 | 8b67b1490a84811271141cbcd8c7024608ee0ab0661cf757ae3baf0f0ff1f2ba |
Hashes for atomic_bomb_engine-0.38.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f95ee7b6886e3d733b00aeb0b7ebc86a836e9e21ad5485db02247ae950fd8d63 |
|
MD5 | fd5934abd5c82e18a4a7cabbe1dc0d2d |
|
BLAKE2b-256 | 730cfaab7e545f3b94afe5bacf94d96e7954f88215963177ff7bf81ea75b87d3 |
Hashes for atomic_bomb_engine-0.38.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8dee2b9442e3d3b93c422eeac3ece632c7ca27dc36c4c5984b5dacb53d3cfcb0 |
|
MD5 | dec5d5e5247af8e768d7dd05ec643c30 |
|
BLAKE2b-256 | fa7dabf43479007a1587adce3c35a7cb0985d2742631d674526838fdbf81d528 |
Hashes for atomic_bomb_engine-0.38.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 23777d16cc0ab3eaf7b68949ae75c94fce9676dcec9767b5b750a99cd641fcb8 |
|
MD5 | 7eea43f2801f7289fcc3716a6f383c2c |
|
BLAKE2b-256 | c3dbb44a9771e98a8c064bce82dfaf6fcf4dd90891f8617a3842142c4095b03f |
Hashes for atomic_bomb_engine-0.38.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 687e46b3c10aec90b7c2a9cd3d099ec8075640c26cbab1423018cfa1b959c694 |
|
MD5 | da659f74da5b87d40da141136ae770c0 |
|
BLAKE2b-256 | 4e3d184e89bc0886ac1c9c48b1644389353dc06f8e57c9d462e9528dc7ad0a8c |
Hashes for atomic_bomb_engine-0.38.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 402d92384ac3550a496b559c35cde8e6c5a988474d9e128570cbfbe75e0f7d3b |
|
MD5 | c67dd9ba7daab68cc69a8bc9d82f16ce |
|
BLAKE2b-256 | 1760b4d10f8c84c409174223427503fd5b240999e3f719f3551c34d3aa4f09f4 |
Hashes for atomic_bomb_engine-0.38.0-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 87b6540b903e15965600423c966feb056ecb29e1d9ba8198024e743caae2e526 |
|
MD5 | bc4daed9d36a6033da1708058dd89a7a |
|
BLAKE2b-256 | ebe42420022aad4d2a078ea214866a567fbbb53b5d5b635504b9ab2d9280cb57 |
Hashes for atomic_bomb_engine-0.38.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2a0088e48da04bb99ff97b1c2e3d456419bb3c7e5461fa6ff8835cb1acac4017 |
|
MD5 | 288d416e38bb5e644d089035967efd5e |
|
BLAKE2b-256 | 3f4eb5bb61c3a8115004f5fb176b87aefa8871397eebb8cf16324d0450d8f7cd |
Hashes for atomic_bomb_engine-0.38.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1906046cbaaa644113e60f5b681570fd3ab6a9cf3df6f1892c5a50e9538b9710 |
|
MD5 | 4ef9eae6e634f8b37bf1ed4d00e448d9 |
|
BLAKE2b-256 | 0adc6116dafdd2a983c523b4f197cb219e68efc077f48d660efb7eb011a48200 |
Hashes for atomic_bomb_engine-0.38.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 68c1c22dd064b7bad09b33bfb76938bf6a85bc5bc0a1dd4b7953dbb19d01bbd5 |
|
MD5 | ec544c6556f23529ddebab4da76594c5 |
|
BLAKE2b-256 | 583270a8b3e2d894fb3e8368ecd55bed1e73dff985b90a1881eea5d257269dfb |