2012-06-20 30 views
3

这是Java HashTable Class的hashCode()实现。如果散列表中元素的数量很大,散列码超过INTEGER MAX LIMIT -2,147,483,648至2,147,483,647,该怎么办?我假设hashCodes将是正整数。如果计算的散列码超过INTEGER MAX LIMIT,会发生什么情况?

public synchronized int hashCode() { 

    int h = 0; 
    if (count == 0 || loadFactor < 0) 
     return h; // Returns zero 

    loadFactor = -loadFactor; // Mark hashCode computation in progress 
    Entry[] tab = table; 
    for (int i = 0; i < tab.length; i++) 
     for (Entry e = tab[i]; e != null; e = e.next) 
      h += e.key.hashCode()^e.value.hashCode(); 
    loadFactor = -loadFactor; // Mark hashCode computation complete 

    return h; 
} 
+2

高于int类型限制(32位)的位将被丢弃。 – nhahtdh

+0

“如果散列表中元素的数量很大”呢?它是什么 - 哈希表必须处理碰撞。没有要求,也不保证哈希码是唯一的(事实上,不可能有这样的保证) –

+3

'的System.out.println(“是否散列码总是积极?”的hashCode());''打印-835520151';) –

回答

11

我认为哈希码将是正整数。

不,不一定。他们只是整数。它们肯定是负面的,在计算散列码时可以有整数溢出。一个理想的散列码将在整个范围内均匀分布(在这种情况下为int)。任何使用一个哈希码肯定需要考虑到值为负值的可能性。

+0

如果我知道我的hashCode在一个特定的小范围内,有没有一种方法可以告诉HashMap只为这个范围创建桶?这应该是更高效,为所有人创造2^32号 – banarun

+0

@banarun桶:没有,但斗的不仅仅是反正在寻找范围内挑选,据我所知。除非你有具体的证据证明这是造成问题的原因,否则我不会担心。 –

+0

例如,如果HashMap容量大于(或等于)hashCode范围,则从hashCode到bucket的一对一映射将是最有效的。但是,这不会是如果HashMap的bucketizes整个整数范围 – banarun

0

有时得到的整数溢出可能不适合您的需求。我有时会这样说。我还没有遇到这种情况,但我想阻止它。

我会贴上你,我用它来生成一个散列码的代码。我通常通过从一个对象中获取所有的变量并将它们转换为字符串并进行计算。

public static int generateHashCode(String ... args) 
{ 
    int length = 0; 
    char[] cArray = null; 
    if(args.length == 1) { 
     length = args[0].length(); 
     cArray = args[0].toCharArray(); 
    } 
    else { 
     for(int i = 0; i < args.length; i++) { 
      length += args[i].length(); 
     } 

     cArray = new char[length]; 
     int incrementer = 0; 
     for(int i = 0; i < args.length; i++) { 
      String str = args[i]; 
      for(int j = 0; j < str.length(); j++) { 
       cArray[incrementer] = str.charAt(j); 
       ++incrementer; 
      } 
     } 
    } 

    int h = 0; 
    for (int i = 0; i < cArray.length; i++) { 
     h = 31*h + cArray[i]; 
    } 

    return h; 
} 
相关问题