数据结构中100%无冲突存储的java对象的唯一ID

时间:2017-11-16 07:12:37

标签: java

我有一个检查两个对象是否相等的方法(通过引用)。

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而不管对象的内容是什么?

1 个答案:

答案 0 :(得分:1)

由于您将它们放入使用hashcode / equals的HashSet并且hashCode的长度为32 bits,因此有一个限制;因此会发生碰撞。特别是因为HashSet实际上只关心n-last位,然后再使其自身更大,从而再添加一位等等。例如,您可以阅读有关此here的更多信息。

问题在这里有所不同:为什么你想要一个无碰撞的结构?如果你定义一个相当好的分布式hashCode和一个相当不错的equals - 这些事情对你来说根本不重要。如果您担心搜索的效果,则O(1)HashSet

你可以根据UUID定义hashCode和相等,就像让我们说UUID#randomUUID一样 - 但是这个仍然将你的hashCode绑定到相同的32位,因此碰撞仍然可能发生。