112 lines
1.7 KiB
Go
112 lines
1.7 KiB
Go
/**
|
|
* Straight copy from:
|
|
* https://stackoverflow.com/questions/23436358/bob-jenkins-hash-getting-bad-performance
|
|
*
|
|
* @license undefined
|
|
*/
|
|
|
|
package bloom
|
|
|
|
type jenkinsHash struct {
|
|
}
|
|
|
|
// adapted from http://bretmulvey.com/hash/7.html
|
|
func (_ jenkinsHash) ComputeHash(data []byte) (uint64, error) {
|
|
var a, b, c uint64
|
|
a, b = 0x9e3779b9, 0x9e3779b9
|
|
c = 0
|
|
i := 0
|
|
|
|
for i = 0; i < len(data)-12; {
|
|
a += uint64(data[i]) | uint64(data[i+1]<<8) | uint64(data[i+2]<<16) | uint64(data[i+3]<<24)
|
|
i += 4
|
|
b += uint64(data[i]) | uint64(data[i+1]<<8) | uint64(data[i+2]<<16) | uint64(data[i+3]<<24)
|
|
i += 4
|
|
c += uint64(data[i]) | uint64(data[i+1]<<8) | uint64(data[i+2]<<16) | uint64(data[i+3]<<24)
|
|
|
|
a, b, c = mix(a, b, c)
|
|
}
|
|
|
|
c += uint64(len(data))
|
|
|
|
if i < len(data) {
|
|
a += uint64(data[i])
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
a += uint64(data[i]) << 8
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
a += uint64(data[i]) << 16
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
a += uint64(data[i]) << 24
|
|
i++
|
|
}
|
|
|
|
if i < len(data) {
|
|
b += uint64(data[i])
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
b += uint64(data[i]) << 8
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
b += uint64(data[i]) << 16
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
b += uint64(data[i]) << 24
|
|
i++
|
|
}
|
|
|
|
if i < len(data) {
|
|
c += uint64(data[i]) << 8
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
c += uint64(data[i]) << 16
|
|
i++
|
|
}
|
|
if i < len(data) {
|
|
c += uint64(data[i]) << 24
|
|
i++
|
|
}
|
|
|
|
a, b, c = mix(a, b, c)
|
|
return c, nil
|
|
}
|
|
|
|
func mix(a, b, c uint64) (uint64, uint64, uint64) {
|
|
a -= b
|
|
a -= c
|
|
a ^= (c >> 13)
|
|
b -= c
|
|
b -= a
|
|
b ^= (a << 8)
|
|
c -= a
|
|
c -= b
|
|
c ^= (b >> 13)
|
|
a -= b
|
|
a -= c
|
|
a ^= (c >> 12)
|
|
b -= c
|
|
b -= a
|
|
b ^= (a << 16)
|
|
c -= a
|
|
c -= b
|
|
c ^= (b >> 5)
|
|
a -= b
|
|
a -= c
|
|
a ^= (c >> 3)
|
|
b -= c
|
|
b -= a
|
|
b ^= (a << 10)
|
|
c -= a
|
|
c -= b
|
|
c ^= (b >> 15)
|
|
return a, b, c
|
|
}
|