#哈希表 #哈希 #哈希 #非加密 #确定性的 #算法 #

无需 std zwohash

用于哈希表的快速、确定性、非加密哈希

3 个版本

0.1.2 2020 年 9 月 4 日
0.1.1 2020 年 8 月 30 日
0.1.0 2020 年 8 月 17 日

989算法

Download history 28118/week @ 2024-03-13 32064/week @ 2024-03-20 30102/week @ 2024-03-27 19421/week @ 2024-04-03 26917/week @ 2024-04-10 20469/week @ 2024-04-17 28061/week @ 2024-04-24 14105/week @ 2024-05-01 16053/week @ 2024-05-08 19621/week @ 2024-05-15 29618/week @ 2024-05-22 40763/week @ 2024-05-29 48076/week @ 2024-06-05 29118/week @ 2024-06-12 29064/week @ 2024-06-19 27927/week @ 2024-06-26

每月下载量 141,072
用于 3 crates

0BSD 许可证

22KB
232

ZwoHash

ci github crates.io docs.rs

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 还导出类型别名 HashMapHashSet,它们是对 std::collection 的重新导出,并使用 ZwoHash 算法进行哈希。有关如何使用它们的详细信息,请参阅各自的文档。

此 crate 总是导出 ZwoHasher 类型,该类型实现了 std/core 特性 HasherDefault,有关如何在 Rust 的哈希框架中使用它的详细信息,请参阅 core::hash

基准测试

ZwoHash 附带一组 criterion 基准测试,用于测试其与 FxHash 的性能。您可以使用 cargo bench 在您的机器上运行它们。这需要几分钟。

反馈

上述声明基于我迄今为止进行的有限基准测试。如果您决定尝试使用 ZwoHash,我将非常乐意听取您的反馈。我特别感兴趣的是那些 ZwoHash 在真实世界中表现不如 FxHash 的基准测试,但我也很乐意听到 ZwoHash 提高性能的地方。请随时为此提交问题。

no_std

您可以通过禁用此 crate 的默认 std 功能来从 no_std 代码中使用 ZwoHash。

许可证

此软件可在零条款 BSD 许可证下获得,有关完整的许可信息和此处的例外情况,请参阅 COPYRIGHT

贡献

除非您明确声明,否则您提交的任何有意包含在此软件中的贡献都应按照 COPYRIGHT 中定义的方式进行许可。

无运行时依赖