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

Java 如何将位组合成一个long来创建唯一的ID?,java,guid,uuid,bit,Java,Guid,Uuid,Bit,我想编写一个实用程序,它将在Java中为我提供一个相对唯一的ID。一些非常简单的东西,比如时间戳中的x位+随机数中的y位 那么,我将如何实现以下方法: long getUniqueID() { long timestamp = System.currentTimeMillis(); long random = some random long ... return id; } 奖金 对于我可以用来形成身份证的其他容易获得的信息,有什么建议吗 注意:我知道gu

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

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

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

    ...

    return id;
}
奖金

对于我可以用来形成身份证的其他容易获得的信息,有什么建议吗


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

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


例如,您可以获取时间戳,并使用Java中的插入符号^运算符对随机值执行一次计算。如果检测到冲突,则将其添加到结果中。

您尝试的是创建一个将两个长值合并为单个长值的。在这种情况下,由于创建的唯一ID值中的冲突是不可接受的,因此哈希函数的冲突将是最重要的。但是,如果可以将哈希值与以前创建的标识符进行比较,则可以通过修改哈希值直到不发生冲突来解决冲突


例如,您可以获取时间戳,并使用Java中的插入符号^运算符对随机值执行一次计算。如果检测到冲突,则将其添加到结果中。

只需剪裁不需要的位:

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

只需剪掉不需要的部分:

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

如果在同一个JVM中唯一就足够了,那么像这样的东西应该可以完成这项工作

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

如果在同一个JVM中唯一就足够了,那么像这样的东西应该可以完成这项工作

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