#sip-hash #algorithm #generic #safe #64-bit #output #128-bit

siphash_c_d

A no-std, safe, generic implementation of the siphash_c_d algorithm

1 个不稳定版本

0.1.0 2023年6月26日

#1209 in 算法

MIT/Apache

42KB
835

此crate提供了一种纯no_stdsafe的Rust实现,该实现最初在以下位置描述: https://cr.yp.to/siphash/siphash-20120918.pdf.

该文档只描述了输出值为64位的算法。对于128位输出值的算法非常相似,但只在以下链接中描述: https://github.com/veorq/SipHash

SipHash由Jean-Philippe Aumasson和Daniel J. Bernstein发明。

使用Hash64Hash128关键字,您可以获取u64u128位哈希值。

算法被泛化为cd u8整数。对于最常见的用途,定义了2个类型别名

  • SipHash24 对应于 siphash_2_4 (64位哈希值)
  • SipHash48 对应于 siphash_4_8 (64位哈希值)

它已在使用qemu在模拟的MIPS Malta平台上的bigendian平台上进行了测试。

Rust

用法

此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);

如果您想尝试,可以尝试更高的cd

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());

无运行时依赖