0

我想映射一个 UUID 类型的字段。我生成它如下:

导入 java.util.UUID;UUID id = UUID.randomUUID();

使用这个有什么问题吗?我可以为此使用什么转换器?

4

1 回答 1

1

随机!=唯一。在非常非常高的数字下,您可能会发生冲突。有些人对此表示满意....我更愿意避免它,因为即使概率可能接近十亿分之一,如果发生这种情况,调试它就是一个 PITA。

此外,在非常非常非常高的数字下,您更有可能发生碰撞。

阅读此链接

http://johannburkard.de/blog/programming/java/Java-UUID-generators-compared.html

基本上,我看过他的代码一次并且是唯一的,它实际上是该计算机内的mac地址+唯一时间戳,因此不允许两个线程获取相同的时间戳。

事实上,如果你使用@NoSqlId,它实际上是使用 timeA + hostname 的唯一计数器,因此它在一个集群中是唯一的。一个客户端使用 a1、a2、a3 的主机名来保持主键简洁明了。我以前从没想过,但是如果我在键上添加@NoSqlIndex,我可以查询键的范围并且它们是按时间顺序排列的。

我可能应该创建另一个基于时间的生成器,以便人们可以将其用作主键和查询时间范围(如果这对您有用,请添加一个问题,因为我按照客户需要而不是我认为需要的顺序工作)。

以上为回答你的问题。您可以创建转换器,当从 byte[] 到 UUID 时,您可以使用

public static UUID nameUUIDFromBytes(byte[] name)

但是,您需要执行与 Java 源代码中的该功能相反的操作

public static UUID nameUUIDFromBytes(byte[] name) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException nsae) {
        throw new InternalError("MD5 not supported");
    }
    byte[] md5Bytes = md.digest(name);
    md5Bytes[6]  &= 0x0f;  /* clear version        */
    md5Bytes[6]  |= 0x30;  /* set to version 3     */
    md5Bytes[8]  &= 0x3f;  /* clear variant        */
    md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
    return new UUID(md5Bytes);
}

谢谢,院长

于 2012-10-18T00:55:29.523 回答