我正在开发一个实现大量数据结构的库,而我主要是为了学习目的,因为我想了解更多有关数据结构的知识。我现在正在实现HashMap,并且在尝试实现高效的防碰撞哈希函数时遇到了一些麻烦。我不是数据结构方面的专家,也不是哈希算法,所以请不要苛刻。
目前我的散列函数有效,你传递一个字符串并返回一个散列。此哈希是值将存储在数组中的索引。可以return
编辑的示例哈希看起来像695488530
。该值作为索引传递并存储值this.table[695488530] = value
。然而,索引真的很大,因此当我尝试在我的HashMap
测试中注销一个值时,测试只会挂起并挂起,即使在浏览器中我试图将其注销并崩溃铬(大声笑)。因为它试图记录出像:
[
undefined, undefined, undefined, undefined, undefined,
undefined, undefined, undefined, undefined, undefined,
undefined, undefined, ...
After many many values when it reaches index 695488530 -> 'someValue
]
最后,当我的一个Ava
测试尝试注销值时,我等了足够长的时间,它返回了以下错误:
FATAL ERROR: invalid table size Allocation failed - JavaScript heap out of memory
<--- Last few GCs --->
2088 ms: Scavenge 26.7 (59.0) -> 19.8 (60.0) MB, 3.7 / 0 ms [allocation failure].
2891 ms: Scavenge 39.5 (64.0) -> 26.7 (65.0) MB, 7.6 / 0 ms [allocation failure].
3351 ms: Scavenge 43.3 (67.0) -> 31.9 (69.0) MB, 36.6 / 0 ms [allocation failure].
3752 ms: Scavenge 48.2 (72.0) -> 36.9 (74.0) MB, 30.5 / 0 ms [allocation failure].
4120 ms: Scavenge 52.0 (76.0) -> 40.7 (79.0) MB, 26.6 / 0 ms [allocation failure].
如果您想知道我正在使用的哈希算法是crc32:
function makeCRCTable () {
var c;
var crcTable = [];
for(var n =0; n < 256; n++){
c = n;
for(var k =0; k < 8; k++){
c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
}
crcTable[n] = c;
}
return crcTable;
}
function crc32 (str) {
var crcTable = makeCRCTable();
var crc = 0 ^ (-1);
for (var i = 0; i < str.length; i++ ) {
crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF];
}
return (crc ^ (-1)) >>> 0;
}
所以,这就是我的困境。我需要帮助找到资源有效且同时防止冲突的散列函数。我知道持久不可变数据结构的immutable库使用了非常有效的散列函数,我想利用它,但是我不确定它使用的是什么算法,也不知道它来自哪个部分{{ 3}}。如果来自不可变或计算机科学界的任何人都可以帮助我,那就太棒了。