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