18 个版本
0.8.11 | 2024 年 3 月 3 日 |
---|---|
0.8.7 | 2023 年 12 月 29 日 |
0.8.6 | 2023 年 10 月 25 日 |
0.8.3 |
|
0.1.18 |
|
#9 in 算法
9,471,471 每月下载量
用于 17,401 个包 (710 个直接使用)
135KB
3K SLoC
aHash
AHash 是目前在 Rust 中可用的 最快的、DOS 防御性 哈希函数。AHash 旨在仅用于内存哈希映射。
AHash 的输出具有 高质量,但 aHash 不是加密安全的哈希。
设计
由于 AHash 是一个密钥哈希函数,每个映射将生成完全不同的哈希值,除非知道密钥,否则无法预测。这可以防止攻击者发送大量哈希碰撞的项,这些项在哈希映射中使用作为键的 DOS 攻击。
这还避免了由于从一个映射读取并写入另一个映射而导致的 意外二次行为。
目标和非目标
AHash 没有固定的输出标准。这使得它可以随着时间的推移而改进。例如,如果找到任何更快的算法,aHash 将更新以包含该技术。同样,如果发现 aHash 的 DOS 防御性存在任何缺陷,aHash 将更改以纠正缺陷。
因为它没有固定的标准,不同的计算机或不同版本的代码上的计算机将观察到不同的哈希值。因此,aHash 不建议用于除内存映射之外的其他用途。具体来说,aHash 不打算用于网络使用或在需要持久化哈希值的程序中。(在这种情况下,HighwayHash
将是一个更好的选择)
此外,aHash 不打算作为加密安全的哈希函数使用,不应用作 MAC,或任何需要加密安全哈希的地方。(在这种情况下,SHA-3
将是一个更好的选择)
使用方法
AHash 是 Hasher
特性的默认实现的替代品。要使用 aHash 作为哈希函数构建 HashMap
,请执行以下操作
use ahash::{AHasher, RandomState};
use std::collections::HashMap;
let mut map: HashMap<i32, i32, RandomState> = HashMap::default();
map.insert(12, 34);
为了方便,还提供了名为 AHashMap
和 AHashSet
的包装器。它们与原函数功能相同,但输入的字符更少。
use ahash::AHashMap;
let mut map: AHashMap<i32, i32> = AHashMap::new();
map.insert(12, 34);
map.insert(56, 78);
标志
aHash 包有以下标志:
std
:启用需要标准库的功能。(默认开启)这包括提供工具类AHashMap
和AHashSet
。serde
:为工具类AHashMap
和AHashSet
启用serde
支持。runtime-rng
:为了获得 Hashers 的种子,将从操作系统获取随机数。(默认开启)这通过使用 getrandom 库来完成。compile-time-rng
:对于无法访问随机数生成器的操作系统目标,compile-time-rng
提供了替代方案。如果getrandom
不可用且compile-time-rng
已开启,aHash 将在编译时生成随机数并将它们嵌入到二进制文件中。nightly-arm-aes
:为了在 32 位 ARM 上使用 AES 指令,这需要在夜间版本中。在 AArch64 上不需要。即使在运行时没有可用的随机数生成器,这也允许对 DOS 的抵抗力(假设编译的二进制文件不是公开的)。这使得二进制文件不可预测。(如果不可预测性是问题,请参阅 constrandom 的文档)
如果同时开启了 runtime-rng
和 compile-time-rng
,则 runtime-rng
将优先考虑,而 compile-time-rng
将不执行任何操作。如果都没有设置标志,应用程序可以提供种子。有多种可用的 API 可以做到这一点。
与其他哈希器的比较
与其他哈希算法的完整比较可以在 此处 找到。
对于更具有代表性的性能比较,包括使用 HashMap 的开销,请参阅 HashBrown 的基准测试,因为 HashBrown 现在默认使用 aHash 作为其哈希器。
哈希质量
AHash 通过了完整的 SMHasher 测试套件。
复制结果的代码和完整输出 已提交到仓库。
其他常见问题解答
维护了一个单独的常见问题解答文档 此处。如果您有那里未涵盖的问题,请在此处 打开一个问题。
许可证
许可协议为以下之一:
- Apache License,版本 2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示否则,任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双许可,而不附加任何额外条款或条件。
依赖关系
~0.5–1MB
~14K SLoC