1 //go:build (!wasip1 && !runtime_memhash_tsip && !runtime_memhash_leveldb) || (wasip1 && runtime_memhash_fnv)
2 3 // This is the default for all targets except WASI, unless a more specific build
4 // tag is set.
5 6 package runtime
7 8 import "unsafe"
9 10 // Get FNV-1a hash of the given memory buffer.
11 //
12 // https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function#FNV-1a_hash
13 func hash32(ptr unsafe.Pointer, n, seed uintptr) uint32 {
14 var result uint32 = 2166136261 // FNV offset basis
15 result *= uint32(seed)
16 for i := uintptr(0); i < n; i++ {
17 c := *(*uint8)(unsafe.Add(ptr, i))
18 result ^= uint32(c) // XOR with byte
19 result *= 16777619 // FNV prime
20 }
21 return result
22 }
23 24 // Also a FNV-1a hash.
25 func hash64(ptr unsafe.Pointer, n, seed uintptr) uint64 {
26 var result uint64 = 14695981039346656037 // FNV offset basis
27 result *= uint64(seed)
28 for i := uintptr(0); i < n; i++ {
29 c := *(*uint8)(unsafe.Add(ptr, i))
30 result ^= uint64(c) // XOR with byte
31 result *= 1099511628211 // FNV prime
32 }
33 return result
34 }
35