gpt4 book ai didi

java - Java 对象的唯一 ID,用于在数据结构中进行 100% 无冲突存储

转载 作者:行者123 更新时间:2023-11-30 10:22:48 25 4
gpt4 key购买 nike

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

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,而不管对象的内容如何?

最佳答案

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

这里的问题是不同的:为什么你首先想要一个无碰撞结构?如果您定义了一个分布相当好的 hashCode 和一个相当不错的 equals - 这些事情对您来说根本不重要。如果您担心搜索的性能,HashSet 的复杂度为 O(1)

您可以根据 UUID 定义 hashCode 和相等性,比如 UUID#randomUUID - 但是这仍然将您的 hashCode 绑定(bind)到相同的32位,因此仍然可能发生冲突。

关于java - Java 对象的唯一 ID,用于在数据结构中进行 100% 无冲突存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47323665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com