| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package sync |
| |
| import ( |
| "internal/abi" |
| "unsafe" |
| ) |
| |
| // NewBadHashTrieMap creates a new HashTrieMap for the provided key and value |
| // but with an intentionally bad hash function. |
| func NewBadHashTrieMap[K, V comparable]() *HashTrieMap[K, V] { |
| // Stub out the good hash function with a terrible one. |
| // Everything should still work as expected. |
| var m HashTrieMap[K, V] |
| m.init() |
| m.keyHash = func(_ unsafe.Pointer, _ uintptr) uintptr { |
| return 0 |
| } |
| return &m |
| } |
| |
| // NewTruncHashTrieMap creates a new HashTrieMap for the provided key and value |
| // but with an intentionally bad hash function. |
| func NewTruncHashTrieMap[K, V comparable]() *HashTrieMap[K, V] { |
| // Stub out the good hash function with a terrible one. |
| // Everything should still work as expected. |
| var m HashTrieMap[K, V] |
| var mx map[string]int |
| mapType := abi.TypeOf(mx).MapType() |
| hasher := mapType.Hasher |
| m.keyHash = func(p unsafe.Pointer, n uintptr) uintptr { |
| return hasher(p, n) & ((uintptr(1) << 4) - 1) |
| } |
| return &m |
| } |