1. 去重的应用场景和基本原理
1.1 场景引入思考:
- 1.防止发送重复的请求
- 2.防止保存重复的数据
原理:一致, 对二进制字符串去重
1.2 基本原理:
思考:
- 明确 数据构成类型(字符串, 数字 , 对象, 特殊字符…) ==> 来制定去重方案
- 判断依据: 什么样的数据算作重复数据?
总结:
根据给定的 [判断依据] 和 [去重容器], 将原始数据逐一进行判断, 判断去重容器中是否有该数据, 如果没有则把该数据的 对应判断依据 添加到去重容器中, 同时标记该数据是不重复数据; 如果有就不添加, 同时标记该数据是重复数据.
- 判断依据(原始数据, 原始数据特征值)
- 去重容器(存储判断依据)
1.3 特征值判断原因:
- 业务需求
- 效率考量(内存中, 不能太大, 同时判断的速度要足够快)
1.4 去重容器 方案选择
- 临时去重容器: list 、 set 等编程语言的数据结构存储去重数据.
- 存在问题:
- 一旦程序关闭或重启后, 去重容器的数据就被回收了.
- 无法共享、无法持久化保存
- 优势:
- 实现简单方便
- 存在问题:
- 持久化去重容器: redis、myql等数据库存储去重数据.
- 优势:
- 持久化
- 共享方便
- 存在问题:
- 使用与实现相对复杂
- 优势:
2. 基于信息摘要算法的去重
2.1 信息摘要hash算法介绍
-
信息摘要hash算法可以将 任意长度的文本、字节数据, 通过 算法 得到一个固定长度的文本。如, MD5(32位16进制, 128Bit, 16Byte) 、SHA1(40位16进制, 160Bit, 20Byte)等.
- 特征: 只要源文本不同, 计算得到的结果(摘要)必然不同
- 摘要: 摘要算法主要用于比对信息源是否一致, 因为只要源发生变化, 得到的摘要必然不同; 而且通常结果要比源短很多, 所以称为 “摘要”。
-
正因此, 利用信息摘要算法能大大降低去重容器的存储空间使用率, 并提高判断速度, 且由于其强唯一性的特征, 几乎不存在误判.
-
注意:
- hash算法得出的结果本质就是一串数值, 如md5的128位指的是二进制的长度, 十六进制的长度是32位. 一个16进制等于4个二进制(位数不足前面填0).
-
In [1]: from hashlib import md5 In [2]: m5 = md5() # 小写 In [3]: m5.update("abscedwwasgfsdfsd") # python2 中这里不会报错, py3中会报错 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-3-6002a57d4a95> in <module>() ----> 1 m5.update("abscedwwasgfsdfsd") TypeError: Unicode-objects must be encoded before hashing # 对于 字符串来说 [4] 和 [5] 的操作是等价的. # 中文字符串前面不能用 b"", 因为不支持 ascii码 In [4]: m5.update("abscedwwasgfsdfsd".encode