26

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

4

10 回答 10

56

它需要有多独特?

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

于 2010-02-01T18:20:19.183 回答
8
int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

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

于 2010-02-01T18:19:49.770 回答
7
 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();
        }
    }

}

希望这对您有所帮助。

于 2012-08-21T12:07:56.883 回答
4

如果您受到一些限制,这很容易。

如果你有一个线程,你只需使用 uniqueID++;退出时请务必存储当前的 uniqueID。

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

问题是当你有很多 CPU 时——要么在集群中,要么在一些分布式设置中,比如点对点游戏。

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

return (myID << 16) & uniqueID++

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

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

于 2010-02-01T18:55:55.843 回答
2

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

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

如果您希望某些东西在 JVM 之外对其他进程或用户可见、持久性或许多其他考虑因素,那么还有其他方法,但如果没有上下文,您最好使用对象身份的内置唯一性你的系统。

于 2010-02-01T19:21:20.833 回答
1

你需要它吗?

  • 在同时运行的两个 JVM 之间是唯一的。
  • 即使 JVM 重新启动也是唯一的。
  • 线程安全的。
  • 支持空吗?如果没有,请使用 int 或 long。
于 2010-02-04T22:08:10.913 回答
1

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

于 2010-02-01T18:19:12.567 回答
1

UUID 类

于 2010-02-01T18:20:06.150 回答
0

如果只需要 int ,那么 AtomicInteger 可以使它成为可能。

如果需要字符串,那么下面的代码应该通过混合 timeStamp 和 AtomicLong 来工作。

AtomicLong idCounter =  new AtomicLong(100);
long timestamp = System.currentTimeMillis();
long nextLong = idCounter.incrementAndGet();
String randomId = String.valueOf(timestamp)+String.valueOf(nextLong); 
于 2021-10-23T06:21:14.293 回答
-1

任何时候都独一无二:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
于 2014-10-20T18:41:39.463 回答