什么是'哈希'?
哈希,从萌芽时期到现在已有 70 多年历史,音译自'hash',原意是'切碎并搅拌'。即将一个任意长度的输入(键),通过特定的算法(切碎并搅拌),转换成一个固定长度的、看似随机的输出(哈希值)。
听起来很玄乎,实际想做的,就是能够像数组一样,实现对数据的快速访问,且键可以是非整型数字。

那么在编程语言中,是否包含了这种数据结构呢,答案是:有。
JavaScript 的早期版本是没有的,ES6 后才加入,它就是Map。
Map
Map 大家并不陌生,常用来存储键值对,就像这样:
/* 初始化 */
const map = new Map();
// 添加键值对 (key, value)
map.set(12836, '小哈');
map.set(15937, '小啰');
// 根据 key 做查询
let name = map.get(15937);
// 删除
map.delete(12836);
看起来并不复杂,而且如果只是存储键值对,还可以用 Object,甚至更'方便'。那为什么要多创造出来一种数据结构,它们的区别是什么?
Object,意为对象,面向对象编程的精髓是将数据做抽象,定义它所具备的属性和能力。
Map,意为映射,主要用于存储、查找数据,单从这点就很容易区分了。
同时,Map 有专门的增、删、迭代方法,且严格按照插入顺序迭代。
此外,Object 的优化倾向是静态存储和快速访问。Map 的优化倾向是频繁增删。
这样对比下来,它们的特点和应用场景差异还是挺大的。
接下来,深入介绍一下哈希表有哪些特点、用途和痛点。
用数组实现哈希
了解一种数据结构的最佳途径就是亲手实现它。
通常,笔者在这个节点都会比较慌:一来不知从何下手,二来涉及逻辑细节就发懵。但这次不用慌,我们只看最简的'数组实现'。




