1个不稳定版本
| 新 0.2.1 | 2024年8月22日 |
|---|---|
| 0.2.0 |
|
| 0.1.3 |
|
| 0.1.2 |
|
#2 in #wyhash
222 每月下载量
用于 museair
58KB
1K SLoC
wyhash-final4
此crate提供了一个纯Rust实现的wyhash_final4,截至2024年1月是wyhash的最新版本;wyhash是一个极其快速的哈希函数,可以不使用任何机器特定的指令实现,同时产生高质量的哈希结果。有关哈希函数比较的详细信息,请参阅smhasher。
相关作品
在Rust中还有其他几种wyhash的实现,但没有一种是wyhash的最新版本(即final4)。
变体
此crate提供了所有4种wyhash变体,具体如下:
WyHash64,默认变体,使用64位乘法进行混合。WyHash64Condom,使用64位乘法和额外的位异或进行混合WyHash32,使用32位乘法进行混合。WyHash32Condom,使用32位乘法和额外的位异或进行混合
值得注意的是,
- 32位变体在32位平台上速度更快,但在64位平台上速度较慢;
Condom变体由于混合时使用了额外的位异或,所以速度稍慢。由于wyhash使用乘法进行混合,对于某些特定的输入(WyHash64的概率为2^-64),混合变为乘以零,从而丢失所有熵。由于使用了额外的位异或,Condom变体可以抵抗这个问题。
如果您不确定使用哪个变体,请使用WyHash64。
用法
此crate提供了三种哈希输入的方式
-
一次性哈希,例如,只需调用
WyHash64::hash(input)即可获取哈希结果。这是使用默认种子和密钥时最简单也是最推荐的方式。还有Wyhash::hash_with_seed和Wyhash::hash_with_secret用于带自定义种子和密钥的一次性哈希,但除非种子和密钥随时间改变,否则最好使用以下方法。 -
在哈希之前使用
with_seed或with_seed_and_secret创建一个WyHash实例,例如:let hasher = WyHash64::with_seed(fix_seed); hasher.hash(input1); hasher.hash(input2);当种子和密钥固定时,
hasher可以被重复用于对多个输入进行哈希处理。在这种情况下,它比单次哈希更快,因为初始化工作只需进行一次。 -
流式哈希。当输入数据太大,无法放入单个缓冲区,或者输入长度在开始时未知时,可以使用流式哈希器。
let mut hasher = WyHash64::with_seed(seed).streamed(); hasher.write(chunk1); hasher.write(chunk2); hasher.write(chunk3); let hash = hasher.finish();
此外,WyHasher实现了std::hash::Hasher和std::hash::BuildHasher特性,因此可以用作HashMap和HashSet的自定义哈希器。
构建特性
有一些可以启用或禁用的构建特性
-
禁用此特性将使
std::hash::Hasher和std::hash::BuildHasher不针对WhHasher实现,从而使此crate与no_std兼容。 -
wyhash64、wyhash64_condom、wyhash32、wyhash32_condom。这些特性中的每一个都启用了wyhash的相应变体。
默认情况下启用所有特性。
许可证
MIT许可证。有关详细信息,请参阅LICENSE文件。