0

我在大学的一个项目中遇到了问题,我们必须在一个类中编写一个双哈希方法,它返回一个双哈希字符串对象。考虑到 Java 中有一个内置的 hashCode() 方法,我认为这会相对简单,但是当您第二次迭代 hashCode 时,它​​似乎返回完全相同的值。例如:

StringHashCode.java:

public class StringHashCode implements HashCode{
    @Override
    public int giveCode(Object obj) {
        return obj.hashCode();
    }
}

拼写.java

while(dict_fwr.hasNextWord())
{
   String derp = dict_fwr.nextWord();
   System.out.print(derp + "(hash value = " + impl.giveCode(derp) + ")" + "(Double hashed = " + impl.giveCode(impl.giveCode(derp)) + ")\n" );
}

输出摘录:

midwest(hash value = 1055712247)(Double hashed = 1055712247)
partakes(hash value = 1188620491)(Double hashed = 1188620491)
interspersed(hash value = 486466540)(Double hashed = 486466540)
marginally(hash value = 1971567014)(Double hashed = 1971567014)
bemoans(hash value = -223340895)(Double hashed = -223340895)
bankrupt(hash value = -1858199613)(Double hashed = -1858199613)
transpire(hash value = 1052958868)(Double hashed = 1052958868)
conspire(hash value = -567922531)(Double hashed = -567922531)

Dict 是一个包含单词列表的文件,而 class 是 out 讲师创建的一个类,它返回下一个字符串并检查是否有另一个单词。

4

4 回答 4

1

你传递一个intto giveCode()。这被自动装箱为整数。哈希码值的哈希码是一样的,因为 Integer 的哈希码是整数值。从文档

返回:此对象的哈希码值,等于此 Integer 对象表示的原始 int 值。

于 2013-10-18T14:11:39.653 回答
1

您可以尝试对哈希码的 toString 进行哈希处理:

public static int doubleHash(Object obj){
    return new Integer(obj.hashCode()).toString().hashCode();
}
于 2013-10-18T14:16:53.970 回答
0

问题是,对象的 hashCode 是一个int. 将其装箱时,返回intIntegerhashCode 将int再次如此。

为了解决这个问题,将inthashCode 设为 String,然后获取第二个 String 的 hashCode。

这就是它在 main 方法中一步一步的样子:

public class StringHashCode {
    public static void main(String[] args) {
        // make a String
        String stringToDoubleHash = "Hi There";
        // hashCode of the String
        int hashCode = stringToDoubleHash.hashCode();       
        // String representation of hashCode
        String hashCodeString = Integer.toString(hashCode);
        // hashCode of String representation of first hashCode
        int doubleHash = hashCodeString.hashCode();
        System.out.println(hashCode);
        System.out.println(doubleHash);
    }
}

打印出来:

623806085
2090143206

根据您的需要进行调整。

于 2013-10-18T14:21:39.603 回答
0

原始类型int没有方法hashCode,因此默认返回自身。

您将不得不编写自己的散列方法来处理此问题,或者将 int 作为扩展类的Object类传回。

阅读散列是如何工作的,以更好地理解为什么整数会被解析成它们自己的原始形式。简而言之:输入值被映射到不同的值范围内来表示它们。如果没有为 Integer 提供映射,则它默认为整个整数范围,该范围映射到自身。

于 2013-10-18T14:18:10.750 回答