算法原理
- CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验
- 注:仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(只是非常近似的认为是无差错的),并不能保证可靠传输
Java实现
import java.util.zip.CRC32;
String feed_id = "6588328477069149185";
CRC32 crc32 = new CRC32();
crc32.update(feed_id.getBytes());
System.out.println(crc32.getValue());
Print: 3437526013
Python2实现
# -*- coding:utf-8 -*-
import zlib
if __name__ == "__main__":
feed_id = "6588328477069149185"
print zlib.crc32(feed_id) & 0xffffffff
Print: 3437526013
Python3实现
import zlib
if __name__ == "__main__":
feed_id = "6588328477069149185"
print(zlib.crc32(feed_id.encode('utf8')))
Print: 3437526013
Golang实现
import (
"fmt"
"hash/crc32"
)
func main() {
feed_id := "6588328477069149185"
fmt.Println(crc32.ChecksumIEEE([]byte(feed_id)))
}
Print: 3437526013
分库分表机制
- 业务表结构如下:
字段名 | 类型 | 备注 |
---|---|---|
id | Long | 自增ID |
- 常规分库分表做法:对id取模,具体如下:
def shard_hash(self, id, mod) {
return int(id % mod)
}
- 为了使数据分配更平均,可以使用crc32算法得到一个大数,然后再取模
def shard_hash(self, id, mod) {
return int(crc32(id) % mod)
}
- 这种分表方式在客户端实现,简单便捷,但需要侵入业务代码不够友好
附录
- 参考1:https://blog.youkuaiyun.com/Android_Mnbvcxz/article/details/78902737
- 参考2:https://neatlifecoco.com/15623795123706.html
That’s all!