如何将位组合成一个长的来创建一个唯一的ID?

时间:2008-11-25 14:59:48

标签: java guid uuid bit

我想编写一个实用程序,它将在Java中为我提供一个相对唯一的ID。非常简单,比如来自时间戳的x位+来自随机数的y位。

那么,我将如何实现以下方法:

long getUniqueID()
{
    long timestamp = System.currentTimeMillis();
    long random = some random long

    ...

    return id;
}

奖金

对于我可以用来形成我的ID的其他易于获取的信息的任何建议吗?

注意:我知道GUID,我知道Java有一个UUID类,但我不想要128位长的东西。

3 个答案:

答案 0 :(得分:3)

只需剪掉你不需要的位:

return java.util.UUID.randomUUID().getLeastSignificantBits();

答案 1 :(得分:1)

您要做的是创建一个hash function,它将两个长值组合成一个长值。在这种情况下,散列函数的uniformity将是最重要的,因为创建的唯一ID值中的冲突是不可接受的。但是,如果您可以将哈希值与先前创建的标识符进行比较,则可以通过修改哈希值来解决冲突,直到不发生冲突为止。

例如,您可以使用时间戳并使用随机值执行exclusive-or(使用Java中的插入符^运算符)。如果检测到碰撞,则在结果中添加一个。

答案 2 :(得分:1)

如果同一JVM中的唯一性足够,那么这样的事情就可以完成。

public class UniqueID {
  static long current= System.currentTimeMillis();
  static public synchronized long get(){
    return current++;
    }
}