Versions Compared
compared with
Key
- This line was added.
- This line was removed.
- Formatting was changed.
基本介绍
常用经典哈希函数Go语言实现,提供uint32
及uint64
类型的哈希函数。
使用方式:
Code Block | ||
---|---|---|
| ||
import "github.com/gogf/gf/v2/encoding/ghash" |
...
...
...
...
基准测试
Code Block | ||
---|---|---|
| ||
goos: darwin
goarch: amd64
pkg: github.com/gogf/gf/v2/encoding/ghash
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Benchmark_BKDR
Benchmark_BKDR-12 |
...
|
...
39315165 |
...
26. |
...
88 ns/op Benchmark_BKDR64 Benchmark_BKDR64-12 |
...
|
...
|
...
62891215 22. |
...
61 ns/op Benchmark_SDBM Benchmark_SDBM-12 |
...
|
...
49689925 |
...
25. |
...
40 ns/op Benchmark_SDBM64 Benchmark_SDBM64-12 |
...
|
...
48860472 |
...
24. |
...
38 ns/op Benchmark_ |
...
RS
Benchmark_RS-12 |
...
|
...
39463418 |
...
25. |
...
52 ns/op Benchmark_ |
...
RS64 Benchmark_ |
...
RS64-12 |
...
|
...
53318370 |
...
19. |
...
45 ns/op Benchmark_ |
...
JS
Benchmark_JS-12 |
...
|
...
53751033 |
...
23. |
...
20 ns/op Benchmark_JS64 Benchmark_JS64-12 |
...
|
...
62440287 |
...
19.25 ns/op Benchmark_PJW Benchmark_PJW-12 |
...
|
...
42439626 |
...
27. |
...
85 ns/op Benchmark_PJW64 Benchmark_PJW64-12 |
...
|
...
|
...
37491696 |
...
33. |
...
28 ns/op Benchmark_ |
...
ELF Benchmark_ |
...
ELF-12 |
...
38034584 |
...
31. |
...
74 ns/op Benchmark_ |
...
ELF64 Benchmark_ |
...
ELF64-12 |
...
|
...
|
...
44047201 |
...
27. |
...
58 ns/op Benchmark_ |
...
DJB Benchmark_ |
...
DJB-12 |
...
|
...
46994352 |
...
22. |
...
60 ns/op Benchmark_ |
...
DJB64 Benchmark_ |
...
DJB64-12 |
...
61980186 |
...
19. |
...
19 ns/op Benchmark_ |
...
AP Benchmark_ |
...
AP-12 |
...
|
...
29544234 |
...
40. |
...
58 ns/op Benchmark_ |
...
AP64 Benchmark_ |
...
AP64-12 |
...
|
...
28123783 |
...
42. |
...
48 ns/op |
...
重复测试
测试结果与测试内容有关联性和随机性,我这里通过uint64
数值的范围遍历来进行简单的重复性测试,本身不够严谨,因此仅供趣味性参考。
Code Block | ||
---|---|---|
| ||
package main
import (
"encoding/binary"
"fmt"
"math"
"github.com/gogf/gf/v2/encoding/ghash"
)
func main() {
var (
m = make(map[uint64]struct{})
b = make([]byte, 8)
ok bool
hash uint64
)
for i := uint64(0); i < math.MaxUint64; i++ {
binary.LittleEndian.PutUint64(b, i)
hash = ghash.PJW64(b)
if _, ok = m[hash]; ok {
fmt.Println("repeated found:", i)
break
}
m[hash] = struct{}{}
}
} |
测试结果如下:
哈希函数 | 重复位置 | 备注 |
---|---|---|
AP64 | 8388640 | |
BKDR64 | 33536 | |
DJB64 | 8448 | |
ELF64 | 4096 | |
JS64 | 734 | |
PJW64 | 2 | |
RS64 | - | 32G Memory OOM |
SDBM64 | - | 32G Memory OOM |
Panel | ||
---|---|---|
| ||
|