1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00
This commit is contained in:
Xargin 2019-01-01 20:57:36 +08:00
parent cb93277036
commit 5edffff01a

View File

@ -169,9 +169,9 @@ func isPassed(rate int) bool {
### 5.9.3.2 哈希算法 ### 5.9.3.2 哈希算法
求哈希可用的算法非常多比如md5crc32sha1等等但我们这里的目的只是为了给这些数据做个映射并不想要因为计算哈希消耗过多的cpu所以现在业界使用较多的算法是murmurhash下面是我们对这些常见的hash算法的简单benchmark 求哈希可用的算法非常多比如md5crc32sha1等等但我们这里的目的只是为了给这些数据做个映射并不想要因为计算哈希消耗过多的cpu所以现在业界使用较多的算法是murmurhash下面是我们对这些常见的hash算法的简单benchmark
hash.go: 下面使用了标准库的md5sha1和开源的murmur3实现来进行对比。
```go ```go
package main package main
@ -202,7 +202,7 @@ func murmur64() uint64 {
} }
``` ```
hash_test.go 为这些算法写一个基准测试:
```go ```go
package main package main
@ -235,6 +235,8 @@ func BenchmarkMurmurHash64(b *testing.B) {
``` ```
然后看看运行效果:
```shell ```shell
~/t/g/hash_bench git:master go test -bench=. ~/t/g/hash_bench git:master go test -bench=.
goos: darwin goos: darwin
@ -247,13 +249,13 @@ PASS
ok _/Users/caochunhui/test/go/hash_bench 7.050s ok _/Users/caochunhui/test/go/hash_bench 7.050s
``` ```
可见murmurhash相比其它的算法有三倍以上的性能提升。 可见murmurhash相比其它的算法有三倍以上的性能提升。显然做负载均衡的话用murmurhash要比md5和sha1都要好实际上这些年社区里还有另外一些更高效的哈希算法出现感兴趣的读者可以自行调研。
### 5.9.3.3 分布是否均匀 ### 5.9.3.3 分布是否均匀
对于哈希算法来说,性能是一方面的问题,另一方面还要考虑哈希后的值是否分布均匀。 对于哈希算法来说,除了性能方面的问题,还要考虑哈希后的值是否分布均匀。如果哈希后的值分布不均匀,那也自然就起不到负载“均衡”的效果了。
我们先以15810000000开头造一千万个和手机号类似的数字然后将计算后的哈希值分十个桶并观察计数是否均匀 以murmur3为例我们先以15810000000开头造一千万个和手机号类似的数字然后将计算后的哈希值分十个桶并观察计数是否均匀
```go ```go
package main package main
@ -280,9 +282,11 @@ func murmur64(p string) uint64 {
} }
``` ```
看看执行结果:
```shell ```shell
map[7:999475 5:1000359 1:999945 6:1000200 3:1000193 9:1000765 2:1000044 \ map[7:999475 5:1000359 1:999945 6:1000200 3:1000193 9:1000765 2:1000044 \
4:1000343 8:1000823 0:997853] 4:1000343 8:1000823 0:997853]
``` ```
偏差都在1/100以内可以接受。 偏差都在1/100以内可以接受。读者在调研其它算法,并判断是否可以用来做负载均衡时,也应该从本节中提到的性能和均衡度两方面出发,对其进行考察。