3 个版本
0.1.2 | 2020 年 9 月 4 日 |
---|---|
0.1.1 | 2020 年 8 月 30 日 |
0.1.0 | 2020 年 8 月 17 日 |
989 在 算法 中
每月下载量 141,072
用于 3 crates
22KB
232 行
ZwoHash
ZwoHash 实现了一个非常快速的哈希算法,针对哈希表的使用进行了优化。它具有低哈希开销,这对于处理小键非常重要。它是非加密和确定性的,因此不适合将不受信任的用户提供的输入插入到哈希表中,除非采取了其他拒绝服务对策。因此,它涵盖了与 rustc 的 FxHash 相同的使用场景。
与 FxHash 相比,ZwoHash 提供了几乎相同的哈希速度,同时旨在获得更均匀的输出。当用于哈希表时,ZwoHash 几乎总是能够匹配 FxHash 的性能,而对于 FxHash 输出特别差的某些常见输入,ZwoHash 可以大幅超越它。
ZwoHash 使用的哈希算法与 FxHash 非常相似,它们每次处理一个 usize
,并执行相同数量和类型的操作。然而,ZwoHash 用一个稍微昂贵一些的操作替换了最后一个迭代,这提供了更好的输出保证。额外的开销(与哈希数据的尺寸无关)包括执行宽乘法而不是截断乘法,以及一个额外的减法操作。这非常少,当使用 ZwoHash 在哈希表中时几乎不产生开销。
ZwoHash 保证任何输入位都可以影响输出中的任何位。FxHash 不保证这一点,而且不仅如此,ZwoHash 的输出更加均匀。当用于哈希表时,这通常会减少碰撞的数量,从而减少每个访问所需的探测次数。这可能导致 ZwoHash 在该设置中优于 FxHash。
有时,对于 FxHash 特别不适用的输入,ZwoHash 可以大幅超越 FxHash。这包括所有都是 2 的幂的整数键、具有短二进制表示的浮点值、分配器返回的指针以及其他仅在最后处理的 usize
的更高位不同的输入。
使用方法
如果使用默认启用的 std
功能,则此 crate 还导出类型别名 HashMap
和 HashSet
,它们是对 std::collection
的重新导出,并使用 ZwoHash 算法进行哈希。有关如何使用它们的详细信息,请参阅各自的文档。
此 crate 总是导出 ZwoHasher
类型,该类型实现了 std/core 特性 Hasher
和 Default
,有关如何在 Rust 的哈希框架中使用它的详细信息,请参阅 core::hash
。
基准测试
ZwoHash 附带一组 criterion 基准测试,用于测试其与 FxHash 的性能。您可以使用 cargo bench
在您的机器上运行它们。这需要几分钟。
反馈
上述声明基于我迄今为止进行的有限基准测试。如果您决定尝试使用 ZwoHash,我将非常乐意听取您的反馈。我特别感兴趣的是那些 ZwoHash 在真实世界中表现不如 FxHash 的基准测试,但我也很乐意听到 ZwoHash 提高性能的地方。请随时为此提交问题。
no_std
您可以通过禁用此 crate 的默认 std
功能来从 no_std 代码中使用 ZwoHash。
许可证
此软件可在零条款 BSD 许可证下获得,有关完整的许可信息和此处的例外情况,请参阅 COPYRIGHT。
贡献
除非您明确声明,否则您提交的任何有意包含在此软件中的贡献都应按照 COPYRIGHT 中定义的方式进行许可。