fnv64-rs 0.2.0

A lightweight, zero-dependency implementation of the FNV (Fowler–Noll–Vo) hash function.
fnv64-rs-0.2.0 has been yanked.
Visit the last successful build: fnv64-rs-0.3.5

License No Std Rust Version Cargo Version Documentation

🦀 FVN64-RS

A lightweight, zero-dependency, no_std implementation of the 64-bit Fowler–Noll–Vo (FNV) non-cryptographic hash function in Rust.

This crate provides high-performance implementations of the FNV-0, FNV-1, and FNV-1a algorithms using const generics to ensure zero-cost abstractions.

💡 Why FNV?

FNV is a non-cryptographic hash function created by Glenn Fowler, Landon Curt Noll, and Kiem-Phong Vo. It is designed to be:

  1. Extremely fast to compute.
  2. Easy to implement (only multiplication and XOR).
  3. Low collision rate for common data types.

It is particularly effective for small data sets like property names in compilers, object keys in scripts, or small strings.

🚀 Features

  • Zero Dependencies: Pure Rust implementation with no external requirements.
  • no_std Support: Ideal for embedded systems and low-level kernel development.
  • Const Generics: Uses modern Rust features to provide a generic interface for FNV variants.
  • Standard Library Integration: Fully implements core::hash::Hasher and core::hash::BuildHasher.

📦 Usage

Add this to your Cargo.toml:

[dependencies]
fnv64-rs = "0.1.0"

🛠️ Using with HashMap

The FNV algorithm is frequently used in hash maps because of its speed and low collision rate for short keys (like strings or integers).

use std::collections::HashMap;
use fnv64_rs::FvnBuildHasher;

// Initialize a HashMap using the FNV-1a BuildHasher
let mut map: HashMap<String, i32, FvnBuildHasher> = HashMap::default();

map.insert("apple".to_string(), 1);
map.insert("orange".to_string(), 2);

assert_eq!(map.get("apple"), Some(&1));
assert_eq!(map.get("orange"), Some(&2));
assert_eq!(map.get("pineapple"), None);

🛠️ Using with HashSet

The FNV algorithm is frequently used in hash sets because of its speed and low collision rate for short keys (like strings or integers).

use std::collections::HashMap;
use fnv64_rs::FvnBuildHasher;

// Initialize a HashSet using the FNV-1a BuildHasher
let mut set: HashSet<String, FvnBuildHasher> = HashSet::default();

set.insert("apple".to_string());
set.insert("orange".to_string());

assert!(set.contains("apple"));
assert!(set.contains("orange"));
assert!(!set.contains("pineapple"));

🛠️ Direct Hashing

You can use the hasher directly to compute values for specific data:

use core::hash::Hasher;
use fnv64_rs::Fvn1aHasher;

let mut hasher = Fvn1aHasher::default();
hasher.write(b"hello world");
let result = hasher.finish();

println!("Hash: {:x}", result);

📦 Collections (Standard Library)

Feature: std

When the std feature is enabled, fnv64-rs provides convenient type aliases for standard library collections. These are pre-configured with FNV hashers and re-exported at the crate root for a seamless developer experience.

Available Aliases

Type Hash Algorithm Collection
FvnHashMap<K, V> FNV-1a (Default) HashMap
FvnHashSet<V> FNV-1a (Default) HashSet
Fvn1aHashMap<K, V> FNV-1a HashMap
Fvn1aHashSet<V> FNV-1a HashSet
Fvn1HashMap<K, V> FNV-1 HashMap
Fvn1HashSet<V> FNV-1 HashSet
Fvn0HashMap<K, V> FNV-0 HashMap
Fvn0HashSet<V> FNV-0 HashSet

[!TIP] On Nightly Rust, these aliases also support the Allocator API, allowing you to use FNV collections with custom memory allocators. Use --features nightly to enable this.

🛠️ Example: Drop-in Replacement

You can use these aliases directly without needing to manually import or configure a BuildHasher:

use fnv64_rs::{FvnHashMap, FvnHashSet};

// No complex generic boilerplate needed!
let mut map = FvnHashMap::default();
map.insert("id_01", 100);

let mut set = FvnHashSet::default();
set.insert("admin");

📊 Algorithm Variants

Variant Implementation Logic Characteristics
FNV-1a fvn64_rs::Fvn1aHasher (hash ^ byte) * PRIME Recommended. Best avalanche characteristics.
FNV-1 fvn64_rs::Fvn1Hasher (hash * PRIME) ^ byte The original FNV-1 specification.
FNV-0 fvn64_rs::Fvn0Hasher hash = 0; ... Deprecated. Included for historical purposes.
DEFAULT fvn64_rs::FvnHasher (hash ^ byte) * PRIME Default implementation. Implements FNV-1a.

⚖️ License

This project is licensed under the Apache-2.0 License.