| commit | 137d472c43f579e2718a0765dcdbda33b22db5b6 | [log] [tgz] |
|---|---|---|
| author | Android Build Coastguard Worker <[email protected]> | Thu May 23 23:15:11 2024 +0000 |
| committer | Android Build Coastguard Worker <[email protected]> | Thu May 23 23:15:11 2024 +0000 |
| tree | 4ae35a94265b9c697041519825384002316eb3dc | |
| parent | 0616bfff00b6f4f4d0612a93fc50892ff614a1f1 [diff] | |
| parent | 2d4670dc03faa0f31daf61d56616e10d82274f50 [diff] |
Snap for 11881322 from 2d4670dc03faa0f31daf61d56616e10d82274f50 to 24Q3-release Change-Id: Ib791be2135a2866dd3cc41b615030b95cef80649
This crates implements SipHash-2-4 and SipHash-1-3 in Rust.
It is based on the original implementation from rust-core and exposes the same API.
It also implements SipHash variants returning 128-bit tags.
The sip module implements the standard 64-bit mode, whereas the sip128 module implements the 128-bit mode.
In Cargo.toml:
[dependencies] siphasher = "1"
If you want serde support, include the feature like this:
[dependencies] siphasher = { version = "1", features = ["serde"] }
64-bit mode:
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-bit mode:
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();
Due to a confusing and not well documented API, methods from the Hasher trait of the standard library (std::hash::Hasher, core::hash::Hasher) produce non-portable results.
This is not specific to SipHash, and affects all hash functions.
The only safe methods in that trait are write() and finish().
It is thus recommended to use SipHash (and all other hash functions, actually) as documented above.