11 个版本

0.8.12 2024 年 7 月 26 日
0.8.10 2024 年 2 月 17 日
0.8.8 2023 年 12 月 20 日
0.8.7 2023 年 9 月 7 日
0.8.0-beta.5 2020 年 11 月 18 日

#6算法 中排名

Download history 131718/week @ 2024-05-03 147728/week @ 2024-05-10 140751/week @ 2024-05-17 141368/week @ 2024-05-24 159138/week @ 2024-05-31 148218/week @ 2024-06-07 151923/week @ 2024-06-14 159905/week @ 2024-06-21 157935/week @ 2024-06-28 164109/week @ 2024-07-05 171130/week @ 2024-07-12 173702/week @ 2024-07-19 181863/week @ 2024-07-26 179846/week @ 2024-08-02 176714/week @ 2024-08-09 172861/week @ 2024-08-16

741,199 次每月下载
用于 1,053 个包 (131 直接)

BSL-1.0 许可证

105KB
2K SLoC

xxhash-rust

Rust Crates.io Documentation

Rust 中 xxHash 的实现

每个算法都通过功能实现,允许精确控制代码大小。

示例

  • Cargo.toml
[dependencies.xxhash-rust]
version = "0.8.5"
features = ["xxh3", "const_xxh3"]
  • main.rs
use xxhash_rust::const_xxh3::xxh3_64 as const_xxh3;
use xxhash_rust::xxh3::xxh3_64;

const TEST: u64 = const_xxh3(b"TEST");

fn test_input(text: &str) -> bool {
    match xxh3_64(text.as_bytes()) {
        TEST => true,
        _ => false
    }
}

assert!(!test_input("tEST"));
assert!(test_input("TEST"));

功能

默认情况下,所有功能都关闭。

  • std - 启用 std::io::Write 特性实现
  • xxh32 - 启用 32 位算法。适用于 x86 目标
  • const_xxh32 - const fn 版本的 xxh32 算法
  • xxh64 - 启用 64 位算法。适用于 x86_64 目标
  • const_xxh64 - const fn 版本的 xxh64 算法
  • xxh3 - 启用 xxh3 算法系列,在性能方面优于 xxh32xxh64
  • const_xxh3 - const fn 版本的 xxh3 算法

硬件加速

与参考实现类似,包在 xxh3 中实现了各种 SIMD,具体取决于提供的标志。所有检查仅在编译时进行,因此鼓励用户启用这些加速(例如,通过 -C target_cpu=native

使用的 SIMD 加速

  • SSE2 - 广泛可用,在 99% 的情况下可以安全启用。在 x86_64 目标中默认启用。
  • AVX2;
  • Neon - 默认在 aarch64 目标上启用(很可能是这样)
  • Wasm SIMD128 - 必须通过 rust 标志启用:-Ctarget-feature=+simd128

流式传输与一次性

出于性能考虑,一次性版本的算法不会重用流版本。除非需要,建议用户使用一次性版本,这通常会更优。

const fn版本

虽然const fn提供了编译时实现,但这样做会以性能为代价。因此,您只能在编译时使用它。

为了确保在编译时进行计算,请确保将哈希输出初始化为conststatic变量,否则函数可能会在运行时执行,这比常规算法更差。

const fn以最佳方式实现,同时符合Rust const fn的限制,但这些限制非常严格,使得任何高性能代码都成为不可能。

版本说明

  • 0.8.*对应于C的0.8.*

为了与原始实现版本保持一致,我计划在C实现这样做之前,不提升主版本号/次版本号。

与twox-hash的比较

请参阅我的评论

aHash将xxhash视为较慢

有状态的Xxh3虽然不如一次性实现高效,但绝对不慢。

aHash测试是围绕std的低效Hasher接口构建的,每次都需要重新创建hasher:[链接](https://github.com/tkaitchuck/aHash/blob/d9b5c3ff8ce4acae3d2de0de53f5f023818b29c0/compare/tests/compare.rs#L116-L119)

这不是使用Xxh3 hasher的正确方式。

无论是有意还是无意,这都是一个错误的陈述,您不应轻信。

正确使用hasher或更好的一次性版本,将提供与长输入相当甚至更好的结果。

然而,确实如此,aHash在短输入上表现非常出色。

无运行时依赖