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文件。