良好的哈希码和等于具有多个整数值的密钥的实现

时间:2012-04-23 22:45:27

标签: java algorithm

我的hashmap有这样的键:'2 + 4 + 5','653 + 65 + 1324 + 75'。(由+符号分隔的整数值)

什么可能是一个好的哈希码和等于方法,以便像'2 + 4 + 5','5 + 4 + 2','4 + 5 + 2'......这些键(所有的排列为2,4) ,5)应返回相同的哈希码值,equals应返回true。

我打算在键中取整数值,对它们进行排序,将它们按升序排列到字符串中,然后调用字符串hashcode和equals方法。假设我有'5 + 2 + 4'然后我将其更改为“245”并调用字符串hashcode和equals方法。但是,每次我必须进行排序时,这将是一项昂贵的操作。而散列图中的所有方法,比如put,get ......都会很昂贵

还有其他方法可以在日志或线性时间内完成此操作......

3 个答案:

答案 0 :(得分:2)

一个好的哈希码算法应该返回非常不同的哈希值,以便在输入方面略有不同。在您的情况下,您还会将值的排列视为“相等”。

似乎一个好的方法是解析组成整数然后对它们进行排序(一种简单的方法来确保一致的比较顺序)然后:

如果它们具有相同的已排序组成数,则考虑两个值相等。

使用经过验证的哈希方法,例如

hash = value1 + 31 * value2 + 31 * 31 * value3 + 31 * 31 * 31 * value4 + etc.

答案 1 :(得分:1)

简单而有效:

public int hashcode(){
    int hash=5;
    for(int i:array)
       hash=hash*17+i;

    return hash;
}

答案 2 :(得分:1)

class Combination {
    final int[] parts;

    Combination(String str) {
        String[] strings = str.split("\\+");
        parts = new int[strings.length];
        for (int i = 0; i < parts.length; i++) {
            parts[i] = Integer.parseInt(strings[i]);
        }
        Arrays.sort(parts);
    }

    @Override public int hashCode() {
        return Arrays.hashCode(parts);
    }

    @Override public boolean equals(Object o) {
        return o instanceof Combination && Arrays.equals(parts, ((Combination) o).parts);
    }
}

测试代码:

public static void main(String[] args) {
    Set<Combination> set = new HashSet<>();
    set.add(new Combination("1+2+3"));
    set.add(new Combination("1+2+4"));
    System.out.println(set.contains(new Combination("3+2+1"))); // prints "true"
    System.out.println(set.contains(new Combination("4+2+1"))); // prints "true"
    System.out.println(set.contains(new Combination("4+3+1"))); // prints "false"
}