// Copyright 2022 Dolthub, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package maphash import "unsafe" // Hasher hashes values of type K. // Uses runtime AES-based hashing. type Hasher[K comparable] struct { hash hashfn seed uintptr } // NewHasher creates a new Hasher[K] with a random seed. func NewHasher[K comparable]() Hasher[K] { return Hasher[K]{ hash: getRuntimeHasher[K](), seed: newHashSeed(), } } // NewSeed returns a copy of |h| with a new hash seed. func NewSeed[K comparable](h Hasher[K]) Hasher[K] { return Hasher[K]{ hash: h.hash, seed: newHashSeed(), } } // Hash hashes |key|. func (h Hasher[K]) Hash(key K) uint64 { // promise to the compiler that pointer // |p| does not escape the stack. p := noescape(unsafe.Pointer(&key)) return uint64(h.hash(p, h.seed)) }