1
2
3
4
5 package maps
6
7 import (
8 "internal/byteorder"
9 "internal/cpu"
10 "internal/goarch"
11 "unsafe"
12 )
13
14
15
16
17 var UseAeshash bool
18
19 const hashRandomBytes = goarch.PtrSize / 4 * 64
20
21
22 var aeskeysched [hashRandomBytes]byte
23
24
25 var hashkey [4]uintptr
26
27 func AlgInit() {
28
29 if (goarch.GOARCH == "386" || goarch.GOARCH == "amd64") &&
30 cpu.X86.HasAES &&
31 cpu.X86.HasSSSE3 &&
32 cpu.X86.HasSSE41 {
33
34
35
36
37
38 if !checkMasksAndShiftsAlignment() {
39 fatal("maps: global variables for AES hashing are not properly aligned!")
40 }
41 initAlgAES()
42 return
43 }
44 if goarch.GOARCH == "arm64" && cpu.ARM64.HasAES {
45 initAlgAES()
46 return
47 }
48 for i := range hashkey {
49 hashkey[i] = uintptr(bootstrapRand())
50 }
51 }
52
53 func initAlgAES() {
54 UseAeshash = true
55
56 key := (*[hashRandomBytes / 8]uint64)(unsafe.Pointer(&aeskeysched))
57 for i := range key {
58 key[i] = bootstrapRand()
59 }
60 }
61
62 func strHashFallback(a unsafe.Pointer, h uintptr) uintptr {
63 type stringStruct struct {
64 str unsafe.Pointer
65 len int
66 }
67 x := (*stringStruct)(a)
68 return memHashFallback(x.str, h, uintptr(x.len))
69 }
70
71
72 func add(p unsafe.Pointer, x uintptr) unsafe.Pointer {
73 return unsafe.Pointer(uintptr(p) + x)
74 }
75
76
77 func readUnaligned32(p unsafe.Pointer) uint32 {
78 q := (*[4]byte)(p)
79 if goarch.BigEndian {
80 return byteorder.BEUint32(q[:])
81 }
82 return byteorder.LEUint32(q[:])
83 }
84
85 func readUnaligned64(p unsafe.Pointer) uint64 {
86 q := (*[8]byte)(p)
87 if goarch.BigEndian {
88 return byteorder.BEUint64(q[:])
89 }
90 return byteorder.LEUint64(q[:])
91 }
92
View as plain text