String hashCode():结果总是相同的吗?

3
这个问题的答案在这里,非常详尽地解释了Java中的情况。我想知道在Android上的情况是怎样的。具体来说:
问题1: 对于一个给定的字符串,它的哈希码是否总是相同的? (更具体地说,我需要给定字符串的哈希码在用户打开应用程序时在其手机上每次都相同)。
我搜索了Android的String源代码并找到了这个。但我觉得有些危险,因为我不知道Android源代码的第一件事情,也不清楚生产厂商是否进行了修改等等。
问题2: 如果问题1的答案是否定的,那么对于我自己的hashCode()函数,使用上面引用的源代码中的hashCode()是否明智?
2个回答

6
  • 相同的字符串应具有相同的hashCode()(基于hashCode定义)

如果您查看String类的Android hashCode(),您将看到hashCode是基于char数组(相同的),char计数(相同的)和offset字段计算的(这个值似乎总是零(0) - 在String构造函数中设置 - 我不知道为什么Google添加了这个偏移字段。Oracle String.hashCode()仅基于char数组和char计数计算。

  • 您可以像Oracle String hashCode()一样构建自己的hashCode()函数:此实现基于char数组和char计数,因此相同的字符串始终具有相同的hashCode()。

4
作为哈希码算法实际上在接口合同中指定的一部分,而且Java-doc也作为Android SDK头文件的一部分使用,我认为你可以将其视为“稳定”的。
但是,根据你的使用情况,你最好使用像SHA1或SHA256这样的加密强度更高的哈希函数,因为它们产生冲突的可能性也要小得多(Java的hashCode()仅具有32位值范围!)。

啊,是的 - 但事实上,如果我想要覆盖Object的hashCode()方法,它只能返回一个int(32位)! - Jodes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接