我对Java中的哈希很新,而且我已经陷入了几个部分.我有一个包含400个项目的列表(并存储在1.5x = 600的列表中),其中项目ID的范围为1-10k.我一直在寻找一些哈希函数,我最初复制了数据包中的例子,它只使用了折叠.我注意到我已经获得了大约50-60%的空节点,这显然太多了.我还注意到,只需将id修改为600就可以将其减少到可靠的50%空值.
我当前的哈希函数看起来像是,并且因为它是如此丑陋,它只是从一个简单的模型减少1%的空值,平均列表长度为1.32 ...
public int getHash( int id )
{
int hash = id;
hash <<= id % 3;
hash += id << hash % 5;
/* let's go digit by digit! */
int digit;
for( digit = id % 10;
id != 0;
digit = id % 10, id /= 10 )
{
if ( digit == 0 ) /* prevent division by zero */
continue;
hash += digit * 2;
}
hash >>= 5;
return (hash % 600);
}
Run Code Online (Sandbox Code Playgroud)
创建简单哈希函数有哪些好方法?
我会保持简单.将id您的元素作为您的哈希码返回,并让哈希表担心如果感觉需要重新散列它.您的目标应该是为您的对象创建一个唯一的哈希码.
Java HashMap使用以下rehashing方法:
/**
* Applies a supplemental hash function to a given hashCode, which
* defends against poor quality hash functions. This is critical
* because HashMap uses power-of-two length hash tables, that
* otherwise encounter collisions for hashCodes that do not differ
* in lower bits. Note: Null keys always map to hash 0, thus index 0.
*/
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6336 次 |
| 最近记录: |