memhash_fnv.mx raw

   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