【问题标题】:Java UUID generationJava UUID 生成
【发布时间】:2017-06-25 23:02:27
【问题描述】:

我想根据对象生成 UUID。相等的对象需要具有相同的 UUID。

我了解了类型 3 UUID,其值基于名称和命名空间。 java.util.UUID 有一个 nameUUIDFromBytes 方法,它接受一个字节数组作为参数。

所以我正在考虑将我的对象序列化为字节数组并将它们提供给nameUUIDFromBytes 方法。

但我对 UUID 的命名空间方面感到困惑。这是否意味着 UUID 在另一台机器上生成时会有所不同?

生成 UUID 的最佳方法是什么,例如当 obj1.equals(obj2) == true,然后 uuid1.equals(uuid2) == true,即使 uuid1 是在 uuid2 之外的另一台机器上生成的?

编辑:对于那些投票认为它与如何实现 hashCode 重复的人,请重新打开它。我问的是 UUID,而不是 hashCodes。除非您认为生成 UUID 的最佳方法是使用 hashCode。如果是这样,请写一个答案,说明为什么这是最好的方法,而不是用几乎没有任何关系的东西来结束这个问题。

【问题讨论】:

  • 覆盖等于
  • 是否有隐含的“不相等的对象不能有相同的 UUID”?
  • @ΦXocę웃Пepeúpaツ 我应该指定:我显然会覆盖 equals 方法。这不是这里的问题。问题是如何生成 UUID。
  • @roeygol 除非您建议基于 hashCodes 生成 UUID,否则我几乎不认为这些是重复的问题。

标签: java uuid


【解决方案1】:

操作系统将生成的 UUID 保留将来自机器的信息与时间信息 &c 混合的权利。 (事实上​​,早期的 Microsoft UUID 生成器会获取非常不安全的网卡信息,因为它可以从生成的 UUID 中提取出来!)。

所以使用你最喜欢的 UUID 生成器是不合适的。

可以做的是从本质上增强用于创建哈希码的方法,将其扩展到 128 位。将该字节数组转换为 UUID 格式,就完成了。

【讨论】:

  • 有一个type 3 UUID,它基于用户提供的名称的 MD5 摘要并且不使用任何机器特定信息。例如,查看java.util.UUID#nameUUIDFromBytes 方法的源代码,除了 MD5 散列和将结果字节重新打包为 UUID 之外,没有其他内容。所以原问题的作者绝对可以借助Java序列化或NIO将他在equals中使用的所有类字段打包为byte[],并将结果字节传递给nameUUIDFromBytes以获得类型3 UUID。
【解决方案2】:

不同机器的结果是一样的。这就像散列它们。

通过使用 nameUUIDFromBytes,您可以创建符合类型 3 的 uuid。

【讨论】:

    猜你喜欢
    • 2019-09-29
    • 2016-10-23
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多