golang 均匀散列id

        首先来模拟一种情况,我们要对一批id均匀分布到10个redis队列中,然后有10个服务分别消费对应的队列,首先你想到的是不是根据id取模,也就是id%10来作为队列的mod,比如queue_0、queue_1、queue_2,....那么这种情况是可行的。

        但是真实的情况可能是,queue_1的长度有1000个,但是queue_2的长度只有100个,那么是不是说明取模为1的id可能就是要多一些,取模为2的要少一些,因为这样的情况,导致的结果是:你启动了10个任务来消费10个队列,其中一个队列的处理压力特别大,而其他队列的数据特别少,程序是空闲的,问题来了,怎么避免这种情况,同时又能保证数据的顺序性呢?那么就需要用到我们的crc32算法。

        具体使用如下:

key := fmt.Sprintf("%d", id)
hash := crc32.ChecksumIEEE([]byte(key))
mod := int64(hash)%10

这样根据crc32均匀散列的结果就会均匀分布了,比如你用11,21,31,41这样按照传统取模的方式对10取模的话,都会在queue_1中去,但是使用了crc32算法再取模的结果是,他们会散列到不同队列中。

        有兴趣可以使用尝试一下