From 5edffff01aa2f8384cc97fdcd2c87894abdcc52c Mon Sep 17 00:00:00 2001 From: Xargin Date: Tue, 1 Jan 2019 20:57:36 +0800 Subject: [PATCH] fix gl --- ch5-web/ch5-09-gated-launch.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/ch5-web/ch5-09-gated-launch.md b/ch5-web/ch5-09-gated-launch.md index fafc42f..12d6fe5 100644 --- a/ch5-web/ch5-09-gated-launch.md +++ b/ch5-web/ch5-09-gated-launch.md @@ -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以内,可以接受。读者在调研其它算法,并判断是否可以用来做负载均衡时,也应该从本节中提到的性能和均衡度两方面出发,对其进行考察。