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 |
|
#6 在 算法 中排名
741,199 次每月下载
用于 1,053 个包 (131 直接)
105KB
2K SLoC
xxhash-rust
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
算法系列,在性能方面优于xxh32
和xxh64
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
提供了编译时实现,但这样做会以性能为代价。因此,您只能在编译时使用它。
为了确保在编译时进行计算,请确保将哈希输出初始化为const
或static
变量,否则函数可能会在运行时执行,这比常规算法更差。
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
在短输入上表现非常出色。