1 个不稳定版本
0.1.0 | 2023年6月26日 |
---|
#1209 in 算法
42KB
835 行
此crate提供了一种纯no_std
和safe
的Rust实现,该实现最初在以下位置描述: https://cr.yp.to/siphash/siphash-20120918.pdf.
该文档只描述了输出值为64位的算法。对于128位输出值的算法非常相似,但只在以下链接中描述: https://github.com/veorq/SipHash
SipHash由Jean-Philippe Aumasson和Daniel J. Bernstein发明。
使用Hash64
或Hash128
关键字,您可以获取u64
或u128
位哈希值。
算法被泛化为c和d u8
整数。对于最常见的用途,定义了2个类型别名
SipHash24
对应于siphash_2_4
(64位哈希值)SipHash48
对应于siphash_4_8
(64位哈希值)
它已在使用qemu在模拟的MIPS Malta平台上的bigendian平台上进行了测试。
用法
此crate位于crates.io上,可以通过将siphash_c_d
添加到项目的Cargo.toml
依赖项中来使用。
[dependencies]
siphash_c_d = "0.1.0"
密钥可以是
- 一个包含
u64
整数的2元组 - 一个长度至少为16字节的切片
&[u8]
(否则会引发恐慌) - 一个包含16个
u8
整数的数组 - 一个
u128
整数
示例1:密钥由一个包含u64
整数的2元组组成
use siphash_c_d::SipHash24;
// message to be hashed
let msg: &[u8] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
let k0 = 0x0706050403020100_u64;
let k1 = 0x0f0e0d0c0b0a0908_u64;
let hash = SipHash24::new((k0, k1), &msg).unwrap();
assert_eq!(hash, 0xa129ca6149be45e5);
密钥由一个包含u8
整数的切片组成
use siphash_c_d::SipHash24;
// message to be hashed
let key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F".as_bytes();
let msg: Vec<_> = (0..=14_u8).collect();
let hash = SipHash24::new(key, &msg).unwrap();
assert_eq!(hash, 0xa129ca6149be45e5);
密钥由一个包含16个u8
整数的数组组成
use siphash_c_d::SipHash24;
// message to be hashed
let key = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15_u8];
let msg: Vec<_> = (0..=14_u8).collect();
let hash = SipHash24::new(&key, &msg).unwrap();
assert_eq!(hash, 0xa129ca6149be45e5);
密钥是一个u128
整数
use siphash_c_d::SipHash24;
// message to be hashed
let key: u128 = 0x0706050403020100_0f0e0d0c0b0a0908;
let msg: Vec<_> = (0..=14_u8).collect();
let hash = SipHash24::new(key, &msg).unwrap();
assert_eq!(hash, 0xa129ca6149be45e5);
如果您想尝试,可以尝试更高的c
和d
值
use siphash_c_d::{Hash128, SipHash};
let msg = "The quick brown fox jumps over the lazy dog".as_bytes();
let key = "0123456789ABCDEF0".as_bytes();
let higher_hash = SipHash::<32, 64, Hash128>::new(key, &msg).unwrap();
如果密钥长度小于16字节,将返回错误
use siphash_c_d::SipHash24;
let msg = "The quick brown fox jumps over the lazy dog".as_bytes();
let key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E".as_bytes();
let hash = SipHash24::new(key, &msg);
assert!(hash.is_err());