| // Copyright 2025 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. | |
| //go:build linux && (386 || amd64 || arm || arm64 || loong64 || mips64 || mips64le || ppc64 || ppc64le || riscv64 || s390x) | |
| package runtime_test | |
| import ( | |
| "runtime" | |
| "testing" | |
| ) | |
| // DT_GNU_HASH hash function. | |
| func gnuHash(s string) uint32 { | |
| h := uint32(5381) | |
| for _, r := range s { | |
| h = (h << 5) + h + uint32(r) | |
| } | |
| return h | |
| } | |
| // DT_HASH hash function. | |
| func symHash(s string) uint32 { | |
| var h, g uint32 | |
| for _, r := range s { | |
| h = (h << 4) + uint32(r) | |
| g = h & 0xf0000000 | |
| if g != 0 { | |
| h ^= g >> 24 | |
| } | |
| h &^= g | |
| } | |
| return h | |
| } | |
| func TestVDSOHash(t *testing.T) { | |
| for _, sym := range runtime.VDSOSymbolKeys() { | |
| name := sym.Name() | |
| t.Run(name, func(t *testing.T) { | |
| want := symHash(name) | |
| if sym.SymHash() != want { | |
| t.Errorf("SymHash got %#x want %#x", sym.SymHash(), want) | |
| } | |
| want = gnuHash(name) | |
| if sym.GNUHash() != want { | |
| t.Errorf("GNUHash got %#x want %#x", sym.GNUHash(), want) | |
| } | |
| }) | |
| } | |
| } |