package xxh3
import "math/bits"
func Hash (b []byte ) uint64 {
return hashAny (*(*str )(ptr (&b )))
}
func HashString (s string ) uint64 {
return hashAny (*(*str )(ptr (&s )))
}
func hashAny(s str ) (acc u64 ) {
p , l := s .p , s .l
switch {
case l <= 16 :
switch {
case l > 8 :
inputlo := readU64 (p , 0 ) ^ (key64_024 ^ key64_032 )
inputhi := readU64 (p , ui (l )-8 ) ^ (key64_040 ^ key64_048 )
folded := mulFold64 (inputlo , inputhi )
return xxh3Avalanche (u64 (l ) + bits .ReverseBytes64 (inputlo ) + inputhi + folded )
case l > 3 :
input1 := readU32 (p , 0 )
input2 := readU32 (p , ui (l )-4 )
input64 := u64 (input2 ) + u64 (input1 )<<32
keyed := input64 ^ (key64_008 ^ key64_016 )
return rrmxmx (keyed , u64 (l ))
case l == 3 :
c12 := u64 (readU16 (p , 0 ))
c3 := u64 (readU8 (p , 2 ))
acc = c12 <<16 + c3 + 3 <<8
case l > 1 :
c12 := u64 (readU16 (p , 0 ))
acc = c12 *(1 <<24 +1 )>>8 + 2 <<8
case l == 1 :
c1 := u64 (readU8 (p , 0 ))
acc = c1 *(1 <<24 +1 <<16 +1 ) + 1 <<8
default :
return 0x2d06800538d394c2
}
acc ^= u64 (key32_000 ^ key32_004 )
return xxhAvalancheSmall (acc )
case l <= 128 :
acc = u64 (l ) * prime64_1
if l > 32 {
if l > 64 {
if l > 96 {
acc += mulFold64 (readU64 (p , 6 *8 )^key64_096 , readU64 (p , 7 *8 )^key64_104 )
acc += mulFold64 (readU64 (p , ui (l )-8 *8 )^key64_112 , readU64 (p , ui (l )-7 *8 )^key64_120 )
}
acc += mulFold64 (readU64 (p , 4 *8 )^key64_064 , readU64 (p , 5 *8 )^key64_072 )
acc += mulFold64 (readU64 (p , ui (l )-6 *8 )^key64_080 , readU64 (p , ui (l )-5 *8 )^key64_088 )
}
acc += mulFold64 (readU64 (p , 2 *8 )^key64_032 , readU64 (p , 3 *8 )^key64_040 )
acc += mulFold64 (readU64 (p , ui (l )-4 *8 )^key64_048 , readU64 (p , ui (l )-3 *8 )^key64_056 )
}
acc += mulFold64 (readU64 (p , 0 *8 )^key64_000 , readU64 (p , 1 *8 )^key64_008 )
acc += mulFold64 (readU64 (p , ui (l )-2 *8 )^key64_016 , readU64 (p , ui (l )-1 *8 )^key64_024 )
return xxh3Avalanche (acc )
case l <= 240 :
acc = u64 (l ) * prime64_1
acc += mulFold64 (readU64 (p , 0 *16 +0 )^key64_000 , readU64 (p , 0 *16 +8 )^key64_008 )
acc += mulFold64 (readU64 (p , 1 *16 +0 )^key64_016 , readU64 (p , 1 *16 +8 )^key64_024 )
acc += mulFold64 (readU64 (p , 2 *16 +0 )^key64_032 , readU64 (p , 2 *16 +8 )^key64_040 )
acc += mulFold64 (readU64 (p , 3 *16 +0 )^key64_048 , readU64 (p , 3 *16 +8 )^key64_056 )
acc += mulFold64 (readU64 (p , 4 *16 +0 )^key64_064 , readU64 (p , 4 *16 +8 )^key64_072 )
acc += mulFold64 (readU64 (p , 5 *16 +0 )^key64_080 , readU64 (p , 5 *16 +8 )^key64_088 )
acc += mulFold64 (readU64 (p , 6 *16 +0 )^key64_096 , readU64 (p , 6 *16 +8 )^key64_104 )
acc += mulFold64 (readU64 (p , 7 *16 +0 )^key64_112 , readU64 (p , 7 *16 +8 )^key64_120 )
acc = xxh3Avalanche (acc )
top := ui (l ) &^ 15
for i := ui (8 * 16 ); i < top ; i += 16 {
acc += mulFold64 (readU64 (p , i +0 )^readU64 (key , i -125 ), readU64 (p , i +8 )^readU64 (key , i -117 ))
}
acc += mulFold64 (readU64 (p , ui (l )-16 )^key64_119 , readU64 (p , ui (l )-8 )^key64_127 )
return xxh3Avalanche (acc )
default :
acc = u64 (l ) * prime64_1
accs := [8 ]u64 {
prime32_3 , prime64_1 , prime64_2 , prime64_3 ,
prime64_4 , prime32_2 , prime64_5 , prime32_1 ,
}
if hasAVX512 && l >= avx512Switch {
accumAVX512 (&accs , p , key , u64 (l ))
} else if hasAVX2 {
accumAVX2 (&accs , p , key , u64 (l ))
} else if hasSSE2 {
accumSSE (&accs , p , key , u64 (l ))
} else {
accumScalar (&accs , p , key , u64 (l ))
}
acc += mulFold64 (accs [0 ]^key64_011 , accs [1 ]^key64_019 )
acc += mulFold64 (accs [2 ]^key64_027 , accs [3 ]^key64_035 )
acc += mulFold64 (accs [4 ]^key64_043 , accs [5 ]^key64_051 )
acc += mulFold64 (accs [6 ]^key64_059 , accs [7 ]^key64_067 )
return xxh3Avalanche (acc )
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .