什么是哈希
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
用人话讲就是:哈希是把一段数据通过某种算法映射到一个值上去。
广义的讲,身份证号就是一种哈希。比如说,如果我来自新疆维吾尔自治区乌鲁木齐市天山区,那么我的身份证号前六位就是650102
;然后假如我是1949年10月1日出生的,那么接下来八位就是19491001
;接下来如果我性别是男,那么接下来三位就可能是127
;最后一位是基于取模思想生成的校验码。
这就是哈希的思路。用一套特定的算法把一个人和一个编码对应起来。
哈希的用处
哈希的优势是可以把一组大数据压缩成小数据,便于存储。它一般有两种用途:
- 判重:还是拿身份证号举例子,如果我的名字是川建国,那么可能把三个字对应到18个数字不划算,不过如果我的名字是巴勃罗·迭戈·荷瑟·山迪亚哥·弗朗西斯科·德·保拉·居安·尼波莫切诺·克瑞斯皮尼亚百诺·德·罗斯·瑞米迪欧斯·西波瑞亚诺·德·拉·山迪西玛·特立尼达·玛利亚·帕里西奥·克里托·瑞兹度·布拉斯科·川建国,那么把名字对应到身份证号上就是个很明智的选择了。
- 查询:继续拿身份证号举例子,我的名字是川建国,这个名字对应了很多信息,那么就很有必要把这个名字转化成一串数字,然后用数组下标的形式来查询,哈希就是一个很好的选择。
哈希碰撞
试想,如果在1949年10月1日这一天,新疆维吾尔自治区乌鲁木齐市天山区出生了501个男孩,那身份证号肯定会发生重复。这就是哈希碰撞。所以就需要一个好的(碰撞率低的)哈希算法和一个有效处理碰撞的方案。