当前位置:首页 > JavaScript

js实现hash

2026-04-06 01:27:09JavaScript

JavaScript 实现哈希表

哈希表是一种通过键值对存储数据的数据结构,JavaScript 中可以通过对象或 Map 实现。

使用对象实现哈希表

对象是 JavaScript 中最简单的哈希表实现方式,键值对存储直接使用对象的属性和值。

js实现hash

const hashTable = {};

// 添加键值对
hashTable['key1'] = 'value1';
hashTable['key2'] = 'value2';

// 获取值
console.log(hashTable['key1']); // 输出: value1

// 删除键值对
delete hashTable['key1'];

// 检查键是否存在
console.log('key1' in hashTable); // 输出: false

使用 Map 实现哈希表

Map 是 ES6 引入的更专业的哈希表实现,支持任意类型的键,并提供更多操作方法。

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('key1')); // 输出: false

// 获取大小
console.log(hashMap.size); // 输出: 1

自定义哈希函数

如果需要更复杂的哈希逻辑,可以自定义哈希函数。

js实现hash

function customHash(key, size) {
  let hash = 0;
  for (let i = 0; i < key.length; i++) {
    hash = (hash << 5) - hash + key.charCodeAt(i);
    hash |= 0; // 转换为32位整数
  }
  return Math.abs(hash) % size;
}

const size = 100;
const key = 'example';
console.log(customHash(key, size)); // 输出哈希值

处理哈希冲突

哈希冲突可以通过链地址法(数组+链表)或开放寻址法解决。

class HashTable {
  constructor(size = 100) {
    this.size = size;
    this.table = new Array(size).fill(null).map(() => []);
  }

  _hash(key) {
    let hash = 0;
    for (let char of key) {
      hash = (hash << 5) - hash + char.charCodeAt(0);
      hash |= 0;
    }
    return Math.abs(hash) % this.size;
  }

  set(key, value) {
    const index = this._hash(key);
    const bucket = this.table[index];
    const existing = bucket.find(item => item.key === key);
    if (existing) {
      existing.value = value;
    } else {
      bucket.push({ key, value });
    }
  }

  get(key) {
    const index = this._hash(key);
    const bucket = this.table[index];
    const item = bucket.find(item => item.key === key);
    return item ? item.value : undefined;
  }

  delete(key) {
    const index = this._hash(key);
    const bucket = this.table[index];
    const itemIndex = bucket.findIndex(item => item.key === key);
    if (itemIndex >= 0) {
      bucket.splice(itemIndex, 1);
      return true;
    }
    return false;
  }
}

const ht = new HashTable();
ht.set('name', 'Alice');
console.log(ht.get('name')); // 输出: Alice
ht.delete('name');
console.log(ht.get('name')); // 输出: undefined

性能优化

哈希表的性能取决于哈希函数的质量和冲突处理方式。好的哈希函数应均匀分布键,减少冲突。

// 优化哈希函数示例
function optimizedHash(key, size) {
  let hash = 5381;
  for (let i = 0; i < key.length; i++) {
    hash = (hash * 33) ^ key.charCodeAt(i);
  }
  return Math.abs(hash) % size;
}

标签: jshash
分享给朋友:

相关文章

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…