我想映射类型为UUID的字段。 我正在生成如下:
import java.util.UUID; UUID id = UUID.randomUUID();
使用它有什么问题吗?我可以使用什么转换器?
答案 0 :(得分:1)
随机!=独特。非常非常高的数字,你可能会发生碰撞。有些人对此感到满意....我宁愿避免它,即使概率可能接近十亿分之一,如果发生,调试它就是PITA。
此外,非常非常高的数字,你更容易发生碰撞。
阅读此链接
http://johannburkard.de/blog/programming/java/Java-UUID-generators-compared.html
基本上,我查看过他的代码一次并且是唯一的,它实际上是该计算机中的mac地址+ UNIQUE时间戳,因此不允许两个线程获取相同的时间戳。
实际上,如果你使用@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);
}
感谢, 迪安