我有一个检查两个对象是否相等的方法(通过引用)。
public boolean isUnique( T uniqueIdOfFirstObject, T uniqueIdOfSecondObject ) {
return (uniqueIdOfFirstObject == uniqueIdOfSecondObject);
}
(用例)假设我无法控制对象的创建。 我有一个方法
void currentNodeExistOrAddToHashSet(Object newObject, HashSet<T> objectHash) {
// will it be 100% precise? Assuming both object have the same field values.
if(!objectHash.contains(newObject){
objectHash.add(newObject);
}
}
或者我可以做这样的事情
void currentNodeExistOrAddToHashSet(Object newObject, HashSet<T> objectHash){
//as per my knowledge, there might be collision for different objects.
int uniqueId = System.identityHashCode(newObject);
if(!objectHash.contains(uniqueId){
objectHash.add(uniqueId);
}
}
是否有可能在java中获得100%防碰撞ID,即具有不同ID的不同对象,相同的对象具有相同的ID而不管对象的内容是什么?
答案 0 :(得分:1)
由于您将它们放入使用hashcode / equals的HashSet
并且hashCode的长度为32 bits
,因此有一个限制;因此会发生碰撞。特别是因为HashSet
实际上只关心n-last位,然后再使其自身更大,从而再添加一位等等。例如,您可以阅读有关此here的更多信息。
问题在这里有所不同:为什么你想要一个无碰撞的结构?如果你定义一个相当好的分布式hashCode
和一个相当不错的equals
- 这些事情对你来说根本不重要。如果您担心搜索的效果,则O(1)
为HashSet
。
你可以根据UUID
定义hashCode和相等,就像让我们说UUID#randomUUID
一样 - 但是这个仍然将你的hashCode绑定到相同的32位,因此碰撞仍然可能发生。