#hash #hasher #hash-map #aes #no-std

no-std ahash

使用 AES-NI 实现的非加密哈希函数,具有高性能

18 个版本

0.8.11 2024 年 3 月 3 日
0.8.7 2023 年 12 月 29 日
0.8.6 2023 年 10 月 25 日
0.8.3 2023 年 1 月 24 日
0.1.18 2019 年 3 月 31 日

#9 in 算法

Download history 2111040/week @ 2024-04-26 2070873/week @ 2024-05-03 2140212/week @ 2024-05-10 2135577/week @ 2024-05-17 2127664/week @ 2024-05-24 2365384/week @ 2024-05-31 2375547/week @ 2024-06-07 2294532/week @ 2024-06-14 2330504/week @ 2024-06-21 2168612/week @ 2024-06-28 2274589/week @ 2024-07-05 2268568/week @ 2024-07-12 2302617/week @ 2024-07-19 2336741/week @ 2024-07-26 2310034/week @ 2024-08-02 2119154/week @ 2024-08-09

9,471,471 每月下载量
用于 17,401 个包 (710 个直接使用)

MIT/Apache

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);

为了方便,还提供了名为 AHashMapAHashSet 的包装器。它们与原函数功能相同,但输入的字符更少。

use ahash::AHashMap;

let mut map: AHashMap<i32, i32> = AHashMap::new();
map.insert(12, 34);
map.insert(56, 78);

标志

aHash 包有以下标志:

  • std:启用需要标准库的功能。(默认开启)这包括提供工具类 AHashMapAHashSet
  • serde:为工具类 AHashMapAHashSet 启用 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-rngcompile-time-rng,则 runtime-rng 将优先考虑,而 compile-time-rng 将不执行任何操作。如果都没有设置标志,应用程序可以提供种子。有多种可用的 API 可以做到这一点。

与其他哈希器的比较

与其他哈希算法的完整比较可以在 此处 找到。

Hasher performance

对于更具有代表性的性能比较,包括使用 HashMap 的开销,请参阅 HashBrown 的基准测试,因为 HashBrown 现在默认使用 aHash 作为其哈希器。

哈希质量

AHash 通过了完整的 SMHasher 测试套件

复制结果的代码和完整输出 已提交到仓库

其他常见问题解答

维护了一个单独的常见问题解答文档 此处。如果您有那里未涵盖的问题,请在此处 打开一个问题

许可证

许可协议为以下之一:

由您选择。

贡献

除非您明确表示否则,任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双许可,而不附加任何额外条款或条件。

依赖关系

~0.5–1MB
~14K SLoC