This crate offers rust implementations of simple and twisted tabulation hashing for 32-bit und 64-bit integer values.
Instatiating Tab32Simple
or Tab32Twisted
(or their 64-bit counterparts) will initialize a table and
create a random hash function from the respective hash family.
The hash values of an integer key is computed by calling its hash
method.
```rust use tab_hash::Tab32Simple;
fn main() { let keys = vec![0, 8, 15, 47, 11]; let simple = Tab32Simple::new(); for k in keys { println!("{}", simple.hash(k)); } } ```
To reproduce hashes, save the table used by the hash function.
The function can be recreated using the with_table
constructor.
```rust use tab_hash::Tab64Twisted;
fn main() { let key = 42; let twisted1 = Tab64Twisted::new(); let twisted2 = Tab64Twisted::withtable(twisted1.gettable()); let twisted3 = Tab64Twisted::new(); asserteq!(twisted1.hash(key), twisted2.hash(key)); assertne!(twisted1.hash(key), twisted3.hash(key)); } ```
These hash functions do not implement the std::hash::Hasher
trait,
since they do not work on arbitrary length byte streams.
The 64-bit version of twisted tabulation hashing (Tab64Twisted
) requires 128-bit operations (see here).
This implementation is based on the articles of Mihai Pătraşcu and Mikkel Thorup: - Simple Tabulation Hashing - Twisted Tabulation Hashing
Made all structs serializable and deserializable.