#sip-hash #hash #cryptography #crypto

no-std siphasher

纯Rust实现的SipHash-2-4、SipHash-1-3和128位变体

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 算法

Download history 1001131/week @ 2024-04-23 943298/week @ 2024-04-30 934070/week @ 2024-05-07 961975/week @ 2024-05-14 979656/week @ 2024-05-21 1057135/week @ 2024-05-28 1111736/week @ 2024-06-04 1145089/week @ 2024-06-11 1093188/week @ 2024-06-18 1159885/week @ 2024-06-25 1067410/week @ 2024-07-02 1143042/week @ 2024-07-09 1138082/week @ 2024-07-16 1186398/week @ 2024-07-23 1197618/week @ 2024-07-30 1240955/week @ 2024-08-06

4,966,261 每月下载量
7,254 个crate中使用 (134 个直接使用)

MIT/Apache

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