当前位置:首页 > JavaScript

js实现哈希

2026-04-07 04:11:58JavaScript

哈希表的基本实现

在JavaScript中,哈希表可以通过对象或Map实现。对象是键值对的集合,键必须是字符串或Symbol;Map的键可以是任意类型。

// 使用对象实现
const hashTable = {};
hashTable['key1'] = 'value1';
hashTable['key2'] = 'value2';
console.log(hashTable['key1']); // 输出: value1

// 使用Map实现
const map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
console.log(map.get('key1')); // 输出: value1

自定义哈希函数

如果需要自定义哈希函数,可以使用以下方法。这里假设键是字符串类型。

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

// 示例
const hash = hashString('hello', 100);
console.log(hash); // 输出一个0到99之间的整数

处理哈希冲突

哈希冲突可以通过开放寻址法或链地址法解决。以下是链地址法的实现示例。

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

    _hash(key) {
        return hashString(key, this.size);
    }

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

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

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

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

性能优化

哈希表的性能依赖于哈希函数的质量和负载因子。负载因子是表中已存储元素数与总槽数的比值。通常,当负载因子超过0.7时,需要扩容。

js实现哈希

class OptimizedHashTable extends HashTable {
    constructor(size = 10) {
        super(size);
        this.count = 0;
    }

    set(key, value) {
        if (this.count / this.size > 0.7) {
            this._resize();
        }
        super.set(key, value);
        this.count++;
    }

    delete(key) {
        const deleted = super.delete(key);
        if (deleted) {
            this.count--;
        }
        return deleted;
    }

    _resize() {
        const oldTable = this.table;
        this.size *= 2;
        this.table = new Array(this.size).fill(null).map(() => []);
        this.count = 0;
        oldTable.forEach(bucket => {
            bucket.forEach(item => {
                this.set(item.key, item.value);
            });
        });
    }
}

// 示例
const oht = new OptimizedHashTable(5);
oht.set('a', 1);
oht.set('b', 2);
oht.set('c', 3);
oht.set('d', 4);
console.log(oht.size); // 输出: 10 (扩容后)

使用场景

哈希表适用于需要快速查找、插入和删除的场景。例如缓存、字典、频率统计等。JavaScript内置的对象和Map已经足够高效,但在需要自定义哈希函数或处理特定冲突策略时,可以手动实现。

标签: js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…