在playORM中是否有UUID类型的转换器?

时间:2012-10-18 00:12:58

标签: playorm

我想映射类型为UUID的字段。 我正在生成如下:

import java.util.UUID; UUID id = UUID.randomUUID();

使用它有什么问题吗?我可以使用什么转换器?

1 个答案:

答案 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);
}

感谢, 迪安