java:通过哈希函数内存构造

标签 java hash hashtable

我有一个 X 对象,其构造函数接受 4 个整数字段。为了计算它的哈希函数,我简单地将它们放入一个数组中并使用 Arrays.hashCode。

目前构造函数是私有(private)的,我有一个静态创建方法。我想内存构造,以便每当使用之前调用过的 4 个整数参数调用 creator 方法时,我都可以返回与上次相同的对象。 [理想情况下无需创建另一个 X 对象进行比较。]

最初我尝试了一个 hashSet,但这需要我创建一个新的 X 来检查我的 hashSet.contains 是否相等的对象......不要介意我无法从 hashSet 中“获取”的事实。

我的下一个想法是使用一个哈希表映射: 4 个字段的 int 数组的 hashCode --> 对象。我不确定为什么,但感觉不对。感觉我做的工作太多了,hashCode 的意义不就是映射到一堆计算相同 hashCode 的对象吗?

感谢您的建议。

最佳答案

散列码的用途通常是缩小查找特定对象的位置。或者换句话说,这个想法是你的哈希码使得如果两个对象具有相同的哈希码,它们“很可能”是同一个对象。

现在,“非常可能”的可能性在本质上取决于哈希码的宽度(位数)和质量。在 Java 的情况下,使用 32 位散列码,这个“很可能”通常仍然意味着“还不够接近 100%,您可以取消对象数据的实际比较”。因此,除了实现 hashCode() 之外,您还需要在用作 Java Map(HashMap 等)键的对象上实现 equals()。

或者换句话说:您的实现基本上是正确的,即使看起来您做了很多工作。结果是,如果您正在寻找的是性能改进,那么您最好每次都创建一个新对象。但是,如果在功能上您要求永远不会存在超过一个具有一组给定值的对象,那么您的实现基本上是正确的。

原则上你可以做的事情:

  • 如果您有大量整数,那么对于 hashCode(),只需从其中的几个“样本”中形成哈希码——想法是“缩小选择范围”或“相当但不是 100% 可能'相等的哈希码将意味着相等的对象——你的 equals() 必须通过并检查它们,所以循环遍历 hashCode() 和 equals() 中的所有值毫无意义;
  • 有可能,您可以使用更强的散列码,这样您就可以从字面上假设相同的散列码意味着相同的对象。实际上,您在哈希码函数中循环遍历所有值一次,根本没有等于函数。在实践中,这意味着至少使用 strong-ish 64 位哈希码。对于您提到的情况,这可能不值得。但是如果你想稍微了解一下它是如何工作的,我会告诉你我在 advanced use of hash codes in Java 上写的教程。 .

关于java:通过哈希函数内存构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548768/

相关文章:

ruby - 使用正则表达式对散列进行行拆分

c++ - 我在从文件读取的 getc () 中有一个段错误

arrays - 在 Perl 中,如何创建和使用散列数组?

arrays - Powershell读取/更新/写入参数文件

java - 如何在不实际运行代码的情况下知道实现 Comparable<> 的类的排序顺序?

javascript - JavaScript 和 jetty 嵌入式 Websocket 服务器之间的 Websocket 困境

java - Android:在两个 Activity 之间传递文件路径

java - *Manager 类在某些情况下可以维持其存在吗?

powershell - ConvertTo-Json如何保持哈希表字段的顺序

powershell - 构建 HashMap 的 HashMap