js实现hashtable
JavaScript 实现哈希表的方法
使用对象(Object)实现哈希表
JavaScript 的对象({})本质上是一个键值对集合,可以直接用作哈希表。键必须是字符串或 Symbol 类型。

const hashTable = {};
// 添加键值对
hashTable["key1"] = "value1";
hashTable["key2"] = "value2";
// 获取值
console.log(hashTable["key1"]); // 输出: "value1"
// 删除键值对
delete hashTable["key1"];
使用 Map 实现哈希表
ES6 引入的 Map 对象更适合作为哈希表,因为它支持任意类型的键(包括对象),并且保留了插入顺序。

const hashMap = new Map();
// 添加键值对
hashMap.set("key1", "value1");
hashMap.set("key2", "value2");
// 获取值
console.log(hashMap.get("key1")); // 输出: "value1"
// 删除键值对
hashMap.delete("key1");
// 检查键是否存在
console.log(hashMap.has("key2")); // 输出: true
自定义哈希表实现
如果需要完全控制哈希表的行为(如哈希函数、冲突处理等),可以手动实现一个哈希表类。
class HashTable {
constructor(size = 32) {
this.size = size;
this.buckets = new Array(size).fill(null).map(() => []);
}
// 哈希函数
hash(key) {
let hashValue = 0;
for (let i = 0; i < key.length; i++) {
hashValue += key.charCodeAt(i);
}
return hashValue % this.size;
}
// 添加键值对
set(key, value) {
const index = this.hash(key);
const bucket = this.buckets[index];
const existingEntry = bucket.find(entry => entry.key === key);
if (existingEntry) {
existingEntry.value = value;
} else {
bucket.push({ key, value });
}
}
// 获取值
get(key) {
const index = this.hash(key);
const bucket = this.buckets[index];
const entry = bucket.find(entry => entry.key === key);
return entry ? entry.value : undefined;
}
// 删除键值对
delete(key) {
const index = this.hash(key);
const bucket = this.buckets[index];
const entryIndex = bucket.findIndex(entry => entry.key === key);
if (entryIndex !== -1) {
bucket.splice(entryIndex, 1);
return true;
}
return false;
}
}
// 使用示例
const table = new HashTable();
table.set("name", "Alice");
console.log(table.get("name")); // 输出: "Alice"
table.delete("name");
哈希冲突处理
哈希冲突是多个键映射到同一个桶的情况。常见的冲突处理方法包括链地址法(如上述自定义实现)和开放寻址法。
性能优化
- 动态扩容:当哈希表的负载因子(元素数量 / 桶数量)超过阈值时,可以扩容以减少冲突。
- 更好的哈希函数:减少冲突的概率,如使用加密哈希函数(如 SHA-1,但性能较低)或更均匀的分布函数。
注意事项
- 对象(
{})的键只能是字符串或 Symbol,而Map支持任意类型。 - 自定义哈希表需要处理哈希冲突和性能问题。
Map是标准化的哈希表实现,推荐优先使用。






