mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-24 04:22: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 哈希算法
|
### 5.9.3.2 哈希算法
|
||||||
|
|
||||||
求哈希可用的算法非常多,比如md5,crc32,sha1等等,但我们这里的目的只是为了给这些数据做个映射,并不想要因为计算哈希消耗过多的cpu,所以现在业界使用较多的算法是murmurhash,下面是我们对这些常见的hash算法的简单benchmark:
|
求哈希可用的算法非常多,比如md5,crc32,sha1等等,但我们这里的目的只是为了给这些数据做个映射,并不想要因为计算哈希消耗过多的cpu,所以现在业界使用较多的算法是murmurhash,下面是我们对这些常见的hash算法的简单benchmark。
|
||||||
|
|
||||||
hash.go:
|
下面使用了标准库的md5,sha1和开源的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以内,可以接受。读者在调研其它算法,并判断是否可以用来做负载均衡时,也应该从本节中提到的性能和均衡度两方面出发,对其进行考察。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user