Java 如果hashcode计算值超过整数最大限制,会发生什么情况?

Java 如果hashcode计算值超过整数最大限制,会发生什么情况?,java,hash,integer,hashmap,hashtable,Java,Hash,Integer,Hashmap,Hashtable,下面是Java HashTable类的hashCode()实现。如果哈希表中的元素数量很大,并且哈希代码超过了最大整数限制2147483648到2147483647,该怎么办?我假设hashcode是正整数 public synchronized int hashCode() { int h = 0; if (count == 0 || loadFactor < 0) return h; // Returns zero loadFactor

下面是Java HashTable类的hashCode()实现。如果哈希表中的元素数量很大,并且哈希代码超过了最大整数限制2147483648到2147483647,该怎么办?我假设hashcode是正整数

 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;
}
public synchronized int hashCode(){
int h=0;
如果(计数==0 | |载荷系数<0)
返回h;//返回零
loadFactor=-loadFactor;//标记正在进行的哈希代码计算
条目[]选项卡=表格;
对于(int i=0;i
我假设hashcode是正整数

 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;
}

不,不一定。它们只是整数。它们肯定是负数,在计算散列码时可以使用整数溢出。理想的散列码将均匀地分布在其整个范围内(
int
)。任何使用散列码的操作都必须考虑到值为负值的可能性。

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

我将向您粘贴用于生成哈希代码的代码。我通常通过从一个对象获取所有变量并将它们转换为字符串来完成计算

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;
}
公共静态int-generateHashCode(字符串…参数)
{
整数长度=0;
char[]cArray=null;
如果(args.length==1){
长度=参数[0]。长度();
cArray=args[0]。toCharArray();
}
否则{
对于(int i=0;i
超过int-type限制(32位)的位将被丢弃。“如果哈希表中的元素数量很大怎么办?”?还有什么呢?哈希表必须处理冲突。没有要求也没有保证哈希代码是唯一的(实际上,没有这种保证)
System.out.println(“哈希代码总是正的吗?”.hashCode())打印
-835520151
;)如果我知道我的hashCode在某个小范围之间,有没有办法让HashMap只为这个范围创建bucket?这应该比为所有2^32创建存储桶更有效numbers@banarun:没有,但据我所知,水桶不是通过查看范围来挑选的。除非你有确凿的证据证明这会导致问题,否则我不会担心。例如,如果HashMap容量大于(或等于)hashCode范围,那么从hashCode到bucket的一对一映射将是最有效的。但如果HashMap对整个整数进行bucketizes处理,情况就不是这样了range@banarun:同样,您是否有证据表明这确实导致您的应用程序出现问题?如果是这样,我建议你用一个完整的例子问一个新问题。(指定是否也可以更改哈希算法…)