让Abstract
成为一个抽象类,以及A1,A2,...,An
从Abstact
继承的具体类。 Ai
中的每一个都有一个Abstract
列表和一个预定义的,在编译时已知的原始类型集合,我们假设我们有一个静默函数,并且没有'循环'在每个具体元素的结构中。
如果两个元素e1和e2具有相同的预定义基元值,则它们是相同的;如果e1中的每个Abstract
,则e2中存在Abstract
,使得e1和e2相同。 (换句话说,顺序并不重要)。
我正在为这类问题寻找一个好的哈希启发式算法。它不应该(并且据我所知,不可能)是一个完美的哈希函数,但它应该在运行时很好并且易于计算。
如果有人可以给我一些指导如何实现这样的功能,或者引导我找到解决这个问题的文章,我会很高兴。
PS我用Java编写,我认为(如果我错了,请纠正我)内置的hash()
对于这个问题不够好。
编辑:
列表和原语在构造后是固定的,但在编译时是未知的。
答案 0 :(得分:2)
如果这些列表在构造后可以更改,那么将哈希函数基于它们是一个坏主意。想象一下,如果你将对象卡入HashMap
,然后改变它的一部分。您将无法再在HashMap
中找到它,因为其hashCode
会有所不同。
您应该只将hashCode
的结果基于不可变值。如果您的对象中没有任何不可变值,那么最好的选择可能就是使用基本的Object.hashCode()
,尽管您将失去平等测试。
但是,如果这些对象是不可变的,那么我建议为元素选择某种排序顺序。然后,您可以在列表中计算哈希码,知道即使列表的顺序不同也会相同,因为您在散列之前对值进行排序。
答案 1 :(得分:1)
使用Google Guava的实用程序...... Objects.hashCode()非常棒。此外,源代码可用,它们已经解决了您所述的问题,因此您可以查看其解决方案。