12个稳定版本
3.4.1 | 2024年5月27日 |
---|---|
3.3.2 | 2024年5月27日 |
3.1.1 | 2024年1月21日 |
3.1.0 | 2023年12月30日 |
1.1.1 | 2023年11月17日 |
#126 在 算法 中
4,089 每月下载量
用于 15 个crate(13个直接使用)
40KB
646 行
GxHash
用法
cargo add gxhash
直接作为哈希函数使用
let bytes: &[u8] = "hello world".as_bytes();
let seed = 1234;
println!(" 32-bit hash: {:x}", gxhash::gxhash32(&bytes, seed));
println!(" 64-bit hash: {:x}", gxhash::gxhash64(&bytes, seed));
println!("128-bit hash: {:x}", gxhash::gxhash128(&bytes, seed));
GxHash提供对Hasher
特质的实现。为了方便,此crate还提供了类型别名 gxhash::HashMap
和 gxhash::HashSet
。
use gxhash::{HashMap, HashMapExt};
let mut map: HashMap<&str, i32> = HashMap::new();
map.insert("answer", 42);
功能
极快 🚀
截至今天,GxHash是其类中速度最快的非加密哈希算法,适用于所有输入大小。这种性能主要归功于大量使用SIMD内建函数、高ILP构造、小字节码(易于内联和缓存)和一些(非常不安全)技巧。
查看基准测试。
高度稳健 🗿
GxHash使用多轮硬件加速AES分组密码来高效地混合位。
因此,GxHash通过了所有SMHasher测试,这是非加密哈希函数的事实上的质量基准,汇集了大多数现有算法。GxHash具有低冲突、均匀分布和高雪崩特性。
查看论文以获取更多技术细节。
0个依赖项 📦
GxHash没有cargo依赖项。便利类型Hasher
和 Hashset/
Hashmap
需要`std`库,默认启用`std`功能。
可移植性
重要 因为GxHash依赖于`aes`硬件加速,您必须在构建时确保启用`aes`功能(否则无法构建)。这可以通过设置环境变量`RUSTFLAGS`为`-C target-feature=+aes或`-C target-cpu=native(后者应适用于您的CPU被rustc正确识别的情况,通常是这种情况)来完成。
架构兼容性
GxHash 兼容以下处理器
- 支持带有
AES-NI
和SSE2
内置函数的 X86 处理器 - 支持带有
AES
和NEON
内置函数的 ARM 处理器
警告 目前不支持其他平台(没有回退)。在这些平台上无法构建 GxHash。
哈希稳定性
对于 GxHash 的给定版本,所有生成的哈希都是稳定的,这意味着对于给定的输入,所有支持的平台上的输出哈希将相同。
no_std
std
功能标志启用了 HashMap
/HashSet
容器便利类型别名。默认情况下是启用的。禁用可让 crate 变为 no_std
[dependencies.gxhash]
...
default-features = false
hybrid
hybrid
功能标志启用了 GxHash 的混合实现。默认情况下是禁用的。当 hybrid
功能启用且 CPU 支持时,GxHash 将使用更宽的寄存器和指令(VAES
+ AVX2
),这可以显著提高大输入的性能。这保留了哈希稳定性,即带有或没有 hybrid
功能生成的哈希对于给定的输入和种子是相同的。
注意:即使没有启用此功能,GxHash 也已经是当前最快的选项之一。我们建议只有在输入可以大于几百字节时才启用此功能,请参阅下面的基准测试。
基准测试
GxHash 在 X86 和 ARM 的 Github 运行器上不断进行基准测试。
要本地运行基准测试,请使用以下之一
# Benchmark throughput
# Add --features bench-md for markdown output or --features bench-plot for .svg plots
cargo bench --bench throughput
# Benchmark performance of GxHash's Hasher when used in a HashSet
cargo bench --bench hashset
吞吐量
吞吐量是以每秒多少字节进行哈希来衡量的。
有些人更喜欢谈论 延迟(生成哈希的时间)或 哈希率(每秒生成的哈希数)来衡量哈希函数的性能,但最终它们都是等效的,因为它们都归结为测量哈希某个输入所需的时间,然后应用不同的标量转换。例如,如果 4 字节哈希的延迟是 1 ms
,则吞吐量为 1 / 0.001 * 4 = 4000 字节/秒
。吞吐量允许我们方便地比较任何输入大小上的哈希函数的性能。
最新基准测试结果
安全性
DOS 防御
GxHash 是一个带种子的哈希算法,这意味着根据使用的种子,它将生成完全不同的哈希。默认的 HasherBuilder
(GxHasherBuilder::default()
)使用种子随机化,这使得任何 HashMap
/HashSet
更具 DOS 防御能力,因为它将使攻击者更难预测可能发生冲突的哈希,除非知道使用的种子。但这并不意味着它完全具有 DOS 防御能力。这需要进一步分析。
多冲突防御
GxHash 使用 128 位内部状态。这使得 GxHash 在生成 64 位或更小大小的哈希时成为 宽管道构造,这具有抵抗多冲突攻击的固有特性。有关更多详细信息,请参阅 这篇论文。
加密特性
GxHash 是一种非加密散列算法,因此不建议将其用作加密算法(它不是 SHA 的替代品)。尚未评估 GxHash 是否具有抗碰撞性以及逆向其难度。
贡献
- 欢迎提交 PR
- 仓库可以通过
cargo
命令完全使用 - 版本号如下
- 主版本号用于不稳定的更改(更改后相同输入的输出哈希值不同)
- 次版本号用于 API 更改/删除
- 补丁号用于新 API、错误修复和性能改进
ℹ️ cargo-asm 是一种查看实际生成的汇编代码的简单方法(
cargo asm gxhash::gxhash::gxhash64
)(否则不会由工具看到,应移除#[inline]
注解)
ℹ️ AMD μProf 提供了有关每条指令耗时的一些有用见解。
发布
作者注:我致力于科学知识的公开传播。在信息获取比以往任何时候都更加民主化的时代,我相信科学应该对所有人均免费开放——无论是用于消费还是贡献。传统的科学期刊通常涉及重大的财务成本,这可能导致偏见,并使研究重点从纯粹的科学追求转移到当前流行的东西。
为应对这一趋势并维护研究的真正精神,我选择将我的“gxhash”工作直接发布在 GitHub 上,确保任何感兴趣的人都可以公开访问。此外,使用免费的 Zenodo DOI 确保这项研究可引用,并可以在其他作品中引用,就像传统出版物一样。
我坚信在一个科学不隐藏在付费墙后的世界,我致力于一个更加包容、无偏见和开放的科研社区。
发布
PDF