我想映射一个 UUID 类型的字段。我生成它如下:
导入 java.util.UUID;UUID id = UUID.randomUUID();
使用这个有什么问题吗?我可以为此使用什么转换器?
我想映射一个 UUID 类型的字段。我生成它如下:
导入 java.util.UUID;UUID id = UUID.randomUUID();
使用这个有什么问题吗?我可以为此使用什么转换器?
随机!=唯一。在非常非常高的数字下,您可能会发生冲突。有些人对此表示满意....我更愿意避免它,因为即使概率可能接近十亿分之一,如果发生这种情况,调试它就是一个 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);
}
谢谢,院长