Bug: 330683646

Clone this repo:
  1. d3397fd Migrate 25 crates to monorepo by James Farrell · 4 months ago main
  2. d8e2cfa Merge "Create patch from LICENSE file" into main am: 581c608ba1 by Treehugger Robot · 6 months ago
  3. 581c608 Merge "Create patch from LICENSE file" into main by Treehugger Robot · 6 months ago
  4. 0114119 Update Android.bp by running cargo_embargo am: c39c6a42b6 by James Farrell · 6 months ago
  5. 20b6e56 Create patch from LICENSE file by James Farrell · 6 months ago

SipHash implementation for Rust

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.

Usage

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

API documentation

Note

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.