HashMap的哈希函数

时间:2016-08-19 23:06:19

标签: javascript node.js data-structures computer-science immutable.js

我正在开发一个实现大量数据结构的库,而我主要是为了学习目的,因为我想了解更多有关数据结构的知识。我现在正在实现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}}。如果来自不可变或计算机科学界的任何人都可以帮助我,那就太棒了。

0 个答案:

没有答案