Java UUID生成

3
我想基于对象生成UUID。相等的对象需要具有相同的UUID。
我了解到类型3 UUID的值是基于名称和命名空间的。java.util.UUID有一个nameUUIDFromBytes方法,它以字节数组作为参数。
所以我想将我的对象序列化成字节数组,并将其提供给nameUUIDFromBytes方法。
但是,我对UUID的命名空间方面感到困惑。这是否意味着在另一台机器上生成UUID时,UUID会不同?
生成UUID的最佳方法是什么,以使得当obj1.equals(obj2)== true时,即使uuid1在另一台机器上生成,uuid1.equals(uuid2)== true?
编辑:对于那些将此投票为如何实现hashCode的重复问题的人,请重新打开此问题。我在问UUID,而不是hashCode。除非您认为生成UUID的最佳方法是使用hashCode。如果是这样,请编写答案,说明为什么这是最佳方法,而不是用几乎与之无关的方式关闭此问题。

覆盖equals方法 - ΦXocę 웃 Пepeúpa ツ
1
可能是hashCode方法的最佳实现的重复问题。 - roeygol
1
@ΦXocę웃Пepeúpaツ 我应该明确指出:我显然会覆盖equals方法。这不是问题所在。问题是我如何生成UUIDs。 - Maarten Dhondt
1
@roeygol,除非您建议根据哈希码生成UUID,否则我几乎不认为这些是重复的问题。 - Maarten Dhondt
@MaartenDhondt 你可以自己检查源代码,没有命名空间,只有输入的byte[]的MD5。 - Alexander Yanyshin
显示剩余7条评论
2个回答

1
操作系统生成的UUID有权将机器信息和时间信息等信息混合在一起。实际上,早期的Microsoft UUID生成器会使用网络卡信息,这是非常不安全的,因为可以从生成的UUID中反推出来!因此,使用您喜欢的UUID生成器是不合适的。您可以增强用于创建哈希码的方法,将其扩展到128位,并将该字节数组转换为UUID格式即可。

有一种基于用户提供的名称的MD5摘要而不使用任何机器特定信息的类型3 UUID。例如,查看java.util.UUID#nameUUIDFromBytes方法的源代码,除了MD5哈希和重新打包结果字节作为UUID之外,没有其他内容。因此,原始问题的作者肯定可以通过Java序列化或NIO将所有用于“equals”的类字段打包为byte [],并将生成的字节传递给nameUUIDFromBytes以获取类型3 UUID。 - Alexander Yanyshin

1
不同机器上的结果将是相同的。这就像对它们进行哈希一样。
通过使用nameUUIDFromBytes,您可以创建符合类型3的uuid。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接