22个版本 (2个稳定版)
1.0.1 | 2024年3月17日 |
---|---|
1.0.0 | 2023年8月23日 |
0.3.11 | 2023年8月23日 |
0.3.10 | 2022年3月6日 |
0.1.3 | 2016年11月29日 |
#17 in 算法
4,966,261 每月下载量
在 7,254 个crate中使用 (134 个直接使用)
57KB
1.5K SLoC
SipHash的Rust实现
这个crate实现了SipHash-2-4和SipHash-1-3,并在Rust中暴露了相同的API。
它基于rust-core的原始实现,并暴露了相同的API。
它还实现了返回128位标签的SipHash变体。
sip
模块实现了标准64位模式,而sip128
模块实现了128位模式。
用法
在Cargo.toml
中
[dependencies]
siphasher = "1"
如果您想添加serde支持,可以像这样包含功能
[dependencies]
siphasher = { version = "1", features = ["serde"] }
64位模式
use siphasher::sip::{SipHasher, SipHasher13, SipHasher24};
// one-shot:
let array: &[u8] = &[1, 2, 3];
let key: &[u8; 16] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let hasher = SipHasher13::new_with_key(key);
let h = hasher.hash(array);
// incremental:
use core::hash::Hasher;
let array1: &[u8] = &[1, 2, 3];
let array2: &[u8] = &[4, 5, 6];
let key: &[u8; 16] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let mut hasher = SipHasher13::new_with_key(key);
hasher.write(array1);
hasher.write(array2);
let h = hasher.finish();
128位模式
use siphasher::sip128::{Hasher128, SipHasher, SipHasher13, SipHasher24};
// one-shot:
let array: &[u8] = &[1, 2, 3];
let key: &[u8; 16] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let hasher = SipHasher13::new_with_key(key);
let h = hasher.hash(array).as_bytes();
// incremental:
use core::hash::Hasher;
let array1: &[u8] = &[1, 2, 3];
let array2: &[u8] = &[4, 5, 6];
let key: &[u8; 16] = &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let mut hasher = SipHasher13::new_with_key(key);
hasher.write(array1);
hasher.write(array2);
let h = hasher.finish128().as_bytes();
API文档
注意
由于API混乱且文档不完善,标准库中的Hasher
trait的方法(std::hash::Hasher
, core::hash::Hasher
)会产生不可移植的结果。
这不仅仅针对SipHash,还影响所有散列函数。
该trait中唯一安全的方法是write()
和finish()
。
因此,建议像上述文档中那样使用SipHash(以及所有其他散列函数)。
依赖关系
~0–300KB