#tabs #hash #hashing #integer #twisted #64-bit #tabulation

tab-hash

Simple and twisted tabulation hashing for 32-bit and 64-bit unsigned integers

6 releases

0.3.0 Feb 12, 2020
0.2.1 Oct 25, 2019
0.1.2 Apr 29, 2019

#2615 in Algorithms

MIT license

22KB
376 lines

Build Status creates.io-version License: MIT docs.rs

tab-hash - Tabulation Hashing for Rust

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.

Example:

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.

use tab_hash::Tab64Twisted;

fn main() {
    let key = 42;
    let twisted_1 = Tab64Twisted::new();
    let twisted_2 = Tab64Twisted::with_table(twisted_1.get_table());
    let twisted_3 = Tab64Twisted::new();
    assert_eq!(twisted_1.hash(key), twisted_2.hash(key));
    assert_ne!(twisted_1.hash(key), twisted_3.hash(key));
}

Note:

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).

Literature:

This implementation is based on the articles of Mihai Pătraşcu and Mikkel Thorup:

Changelog

Version 0.3.0 [2020-02-12]

Made all structs serializable and deserializable.

Dependencies

~1.5–2.6MB
~48K SLoC