by segmentio

segmentio / fasthash

Go package porting the standard hashing algorithms to a more efficient implementation.

150 Stars 11 Forks Last release: Not found MIT License 33 Commits 4 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

fasthash CircleCI Go Report Card GoDoc

Go package porting the standard hashing algorithms to a more efficient implementation.


Go has great support for hashing algorithms in the standard library, but the APIs are all exposed as interfaces, which means passing strings or byte slices to those require dynamic memory allocations. Hashing a string typically requires 2 allocations, one for the Hash value, and one to covert the string to a byte slice.

This package attempts to solve this issue by exposing functions that implement string hashing algorithms and don't require dynamic memory alloations.


To ensure consistency between the

package and the standard library, all tests must be implemented to run against the standard hash functions and validate that both packages produced the same results.


The implementations also have to prove that they are more efficient in terms of CPU and memory usage than the functions found in the standard library.
Here's an example with fnv-1a:

BenchmarkHash64/standard_hash_function 20000000   105.0 ns/op   342.31 MB/s   56 B/op   2 allocs/op
BenchmarkHash64/hash_function          50000000    38.6 ns/op   932.35 MB/s    0 B/op   0 allocs/op

Usage Example: FNV-1a

package main

import ( "fmt"



func main() { // Hash a single string. h1 := fnv1a.HashString64("Hello World!") fmt.Println("FNV-1a hash of 'Hello World!':", h1)

// Incrementally compute a hash value from a sequence of strings.
h2 := fnv1a.Init64
h2 = fnv1a.AddString64(h2, "A")
h2 = fnv1a.AddString64(h2, "B")
h2 = fnv1a.AddString64(h2, "C")
fmt.Println("FNV-1a hash of 'ABC':", h2)


We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.