如何在Java(整数)中生成唯一ID?

时间:2010-02-01 18:18:00

标签: java uniqueidentifier uid

如何生成java中不是猜测下一个数字的整数唯一ID?

9 个答案:

答案 0 :(得分:53)

它有多独特?

如果它在流程中唯一,那么您可以使用AtomicInteger并在每次需要新值时调用incrementAndGet()

答案 1 :(得分:8)

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

如果您希望它是线程安全的,请添加synchronized

答案 2 :(得分:4)

如果你受到一定限制,这很容易。

如果你有一个线程,你只需使用uniqueID ++;退出时一定要存储当前的唯一ID。

如果您有多个线程,则可以使用常见的synchronizedUniqueID方法(实现与上面相同)。

问题在于你有很多CPU - 无论是在集群中还是像对等游戏这样的分布式设置。

在这种情况下,您通常可以将两个部分组合在一起形成一个数字。例如,生成唯一ID的每个进程都可以分配自己的2字节ID号,然后将其与唯一ID ++组合。类似的东西:

return (myID << 16) & uniqueID++

分发“myID”部分可能很棘手,但有一些方法。您只需从集中式数据库中获取一个,从集中式服务器请求唯一ID,...

如果你有一个Long而不是一个Int,其中一个常见的技巧就是获取ETH0的设备ID(UUID),保证服务器是唯一的 - 然后只需添加一个序列号。

答案 3 :(得分:2)

如果你真的是指整数而不是int:

Integer id = new Integer(42); // will not == any other Integer

如果您希望JVM外部可见其他进程或用户,持久性或许多其他注意事项,那么还有其他方法,但没有上下文,您可能最好使用内置的唯一性系统中的对象标识。

答案 4 :(得分:1)

只需生成ID并检查生成的ID列表中是否已存在。

答案 5 :(得分:1)

答案 6 :(得分:1)

你需要它吗?

  • 在运行的两个JVM之间是唯一的 同一时间。
  • 即使是JVM也是唯一的 重新启动。
  • 线程安全的。
  • 支持null?如果没有,请使用int或long。

答案 7 :(得分:1)

 import java.util.UUID;

 public class IdGenerator {
    public static int generateUniqueId() {      
        UUID idOne = UUID.randomUUID();
        String str=""+idOne;        
        int uid=str.hashCode();
        String filterStr=""+uid;
        str=filterStr.replaceAll("-", "");
        return Integer.parseInt(str);
    }

    // XXX: replace with java.util.UUID

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(generateUniqueId());
            //generateUniqueId();
        }
    }

}

希望这会对你有所帮助。

答案 8 :(得分:-2)

随时都是独一无二的:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);