#hasher #hash #hash-map #no-std #crypto

no-std gxhash

GxHash非加密算法

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算法

Download history 511/week @ 2024-05-01 1338/week @ 2024-05-08 952/week @ 2024-05-15 1812/week @ 2024-05-22 1317/week @ 2024-05-29 1083/week @ 2024-06-05 1223/week @ 2024-06-12 1137/week @ 2024-06-19 1027/week @ 2024-06-26 1594/week @ 2024-07-03 943/week @ 2024-07-10 739/week @ 2024-07-17 920/week @ 2024-07-24 1063/week @ 2024-07-31 1182/week @ 2024-08-07 826/week @ 2024-08-14

4,089 每月下载量
用于 15 个crate(13个直接使用)

MIT 许可证

40KB
646

GxHash

Build & Test Cross Compile Rust Version Compatibility

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::HashMapgxhash::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依赖项。便利类型HasherHashset/Hashmap 需要`std`库,默认启用`std`功能。

可移植性

重要 因为GxHash依赖于`aes`硬件加速,您必须在构建时确保启用`aes`功能(否则无法构建)。这可以通过设置环境变量`RUSTFLAGS`为`-C target-feature=+aes或`-C target-cpu=native(后者应适用于您的CPU被rustc正确识别的情况,通常是这种情况)来完成。

架构兼容性

GxHash 兼容以下处理器

  • 支持带有 AES-NISSE2 内置函数的 X86 处理器
  • 支持带有 AESNEON 内置函数的 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 也已经是当前最快的选项之一。我们建议只有在输入可以大于几百字节时才启用此功能,请参阅下面的基准测试。

基准测试

Benchmark
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 字节/秒。吞吐量允许我们方便地比较任何输入大小上的哈希函数的性能。

最新基准测试结果
aarch64 x86_64 x86_64-hybrid

安全性

DOS 防御

GxHash 是一个带种子的哈希算法,这意味着根据使用的种子,它将生成完全不同的哈希。默认的 HasherBuilderGxHasherBuilder::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

引用此出版物/算法
DOI

依赖项