【问题标题】:Issue with double hashing Java双重哈希Java的问题
【发布时间】:2013-10-18 14:05:18
【问题描述】:

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

StringHashCode.java:

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

spell.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 讲师创建的一个类,它返回下一个字符串并检查是否有另一个单词。

【问题讨论】:

  • Integer的hashcode是整数值。
  • 你实现的这个HashCode接口是什么?

标签: java oop methods hashcode double-hashing


【解决方案1】:

您将int 传递给giveCode()。这被自动装箱为整数。哈希码值的哈希码是一样的,因为 Integer 的哈希码是整数值。来自docs

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

【讨论】:

  • 那么我该如何进行双重哈希呢?
  • @ConnerStephenMcCabe 您有什么要求?如果您需要一个即使两个不同字符串的内置哈希码发生冲突也可能不会发生冲突的哈希码,您可以做一些简单的事情,例如("a" + theString).hashCode()。它不是高性能的,但通常可以工作。对于更复杂的东西,您可以查看String.hashCode() 的来源,并使用与 31 不同的素数。
  • 嗯,看源码,第一个建议行不通。 theString.length * theString.hashCode() 适用于长度不相等的任何内容。 (后面的建议应该没问题)。
【解决方案2】:

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

public static int doubleHash(Object obj){
    return new Integer(obj.hashCode()).toString().hashCode();
}

【讨论】:

    【解决方案3】:

    原始类型 int 没有方法 hashCode 所以默认返回自身。

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

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

    【讨论】:

      【解决方案4】:

      问题是,一个对象的 hashCode 是一个int。当将 int 装箱到 Integer 时,返回的 hashCode 将再次是 int

      为了解决这个问题,将int hashCode 设为 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
      

      根据您的需要调整上述内容。

      【讨论】:

      • 当您将“Hi there”换成字符串对象时,这似乎不起作用
      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多