为同一对象定义多个哈希函数

Defining muliple hash functions for the same object

提问人:MAK 提问时间:12/28/2009 更新时间:12/28/2009 访问量:193

问:

我有几个集合来存储同一类的对象,但我想为每个集合指定一个不同的恒等函数(即,在一个集合中,如果 A.x==B.x,则为 A==B,而在另一个集合中,如果 A.y==B.y)。

目前,我使用的 TreeSet 为每个比较器定义了不同的比较器。我想知道如果我想切换到 HashSets,如何做同样的事情。Java 不允许传递单独的哈希函数,就像它允许对排序/基于树的集合进行比较器一样。我能想到的唯一方法是创建一个不同的包装类,并在每个 HashSet 的元素中实现 hashCode() 方法。有没有更好的方法?

Java 哈希

评论


答:

7赞 Poindexter 12/28/2009 #1

如何为每个集合创建单独的子类。每个子类的唯一区别是符合您条件的被覆盖的哈希函数。

评论

3赞 Andrew 12/28/2009
您可以将子类实现为私有内部类,并提供工厂方法来获取所需的相等语义。这完全封装了选择
3赞 Eli Acherkan 12/28/2009 #2

我不知道有更好的方法。您提出的解决方案(具有不同比较逻辑的包装类)听起来非常合理。

你提到了实现该方法 - 不要忘记实现。hashCodeequals

2赞 Aaron Digulla 12/28/2009 #3

还有另一种选择:您可以复制 的源代码并将其替换为其他内容(例如,对 a 的调用,其工作方式类似于 of the )。HashMaphash(Object key)HasherComparatorTreeMap

评论

0赞 MAK 12/29/2009
谢谢。我想这是最好的办法。我接受 Peter Lawry 的回答,因为他建议使用现成的实现而不是编写我自己的代码。
2赞 Peter Lawrey 12/28/2009 #4

你可以尝试在 GNU Trove 中使用 THashSet,它支持多种哈希策略。