#hash #wyhash #hashing #latest-version #pure #variant #secret

no-std wyhash-final4

wyhash_final4哈希函数的Rust实现

1个不稳定版本

0.2.1 2024年8月22日
0.2.0 2024年8月22日
0.1.3 2024年2月23日
0.1.2 2024年1月17日

#2 in #wyhash

Download history 6/week @ 2024-05-04 13/week @ 2024-05-25 1/week @ 2024-06-01 2/week @ 2024-06-29 7/week @ 2024-07-06 42/week @ 2024-07-27 1/week @ 2024-08-03 179/week @ 2024-08-17

222 每月下载量
用于 museair

MIT 许可证

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_seedWyhash::hash_with_secret用于带自定义种子和密钥的一次性哈希,但除非种子和密钥随时间改变,否则最好使用以下方法。

  • 在哈希之前使用with_seedwith_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::Hasherstd::hash::BuildHasher特性,因此可以用作HashMapHashSet的自定义哈希器。

构建特性

有一些可以启用或禁用的构建特性

  • 禁用此特性将使std::hash::Hasherstd::hash::BuildHasher不针对WhHasher实现,从而使此crate与no_std兼容。

  • wyhash64wyhash64_condomwyhash32wyhash32_condom。这些特性中的每一个都启用了wyhash的相应变体。

默认情况下启用所有特性。

许可证

MIT许可证。有关详细信息,请参阅LICENSE文件。

无运行时依赖