2

让我们Abstract成为一个抽象类,以及A1,A2,...,An继承自的具体类Abstact。每一个Ai都有一个列表Abstract和一个预定义的、在编译时已知的、一组原始类型,假设我们对它们有一个静默函数,并且每个具体元素的结构中没有“循环”。

如果两个元素 e1 和 e2 对于预定义的基元具有相同的值,则它们是相同的,并且如果对于 e1 中的每个元素,在 e2 中都Abstract存在一个Abstract使得 e1 和 e2 相同。(换句话说,顺序并不重要)。

我正在为这类问题寻找一个好的哈希启发式算法。它不应该(据我所知,不可能)是一个完美的哈希函数,但它应该很好并且在运行时易于计算。

如果有人能给我一些指导如何实现这样的功能,我会很高兴,或者指导我阅读一篇解决这个问题的文章。

PS我正在用Java编写,我假设(如果我错了,请纠正我)内置的hash()对于这个问题来说还不够好。
编辑:
列表和原语在构造后是固定的,但在编译时是未知的。

4

2 回答 2

2

如果这些列表在构造后可以更改,那么将散列函数基于它们将是一个坏主意。想象一下,如果你把你的对象放入一个HashMap,然后改变它的一部分。您将无法再在其中找到它,HashMap因为它hashCode会有所不同。

您应该只hashCode基于不可变值的结果。如果您的对象中没有任何不可变值,则最好的选择可能是简单地使用 basic Object.hashCode(),尽管您会在相等测试中失败。

但是,如果这些对象是不可变的,那么我建议为您的元素选择某种排序顺序。然后,您可以计算列表中的哈希码,知道即使列表的顺序不同,它也是相同的,因为您在哈希之前对值进行排序。

于 2011-03-28T14:00:10.933 回答
1

使用 Google Guava 的实用程序... Objects.hashCode()很棒。此外,源是可用的,他们已经解决了你所说的问题,所以你可以看看他们的解决方案。

于 2011-03-28T14:16:39.877 回答