【问题标题】:How to Generate Unique ID in Java (Integer)?如何在 Java 中生成唯一 ID(整数)?
【发布时间】:2011-01-11 20:21:07
【问题描述】:

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

【问题讨论】:

  • 也许您应该更准确地了解您的需求背景。

标签: java uniqueidentifier uid


【解决方案1】:

它需要有多独特?

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

【讨论】:

  • 最好用 Integer.MIN_VALUE 初始化 AtomicInteger。这有助于调试并为您提供更多可玩的数字。
  • 你也需要考虑溢出。 smth like if (curInt == Integer.MAX_INT) reset atomicInteger
【解决方案2】:
int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

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

【讨论】:

  • 可能想要添加一个例外,以防整数过高并翻转。也可能想在 Integer.MinInt() 开始 uniqueId (方法被称为类似的东西)。
  • 这只有在进程永远运行而不停止时才有效。对于重启的应用,每次都会从0开始。
  • 好吧,一开始可能有人会考虑使用 Long 而不是 Integer。
【解决方案3】:
 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();
        }
    }

}

希望对你有所帮助。

【讨论】:

  • -1。虽然 UUID 肯定会提供唯一值,但不能保证当您获取其哈希码时这种唯一性保证会持续存在。您可以在 Integer.MIN_VALUE 和 Integer.MAX_VALUE 之间选择一个随机数,并希望最好。
  • 不是这样。 UUID.randomUUID() 使用加密强的随机数生成器,因此应该比使用较弱的伪随机数生成器更好。
【解决方案4】:

如果你有一些限制,这很容易。

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

如果你有多个线程,一个通用的同步 generateUniqueID 方法可以工作(实现同上)。

问题在于当您有许多 CPU 时 - 无论是在集群中还是在某些分布式设置(如点对点游戏)中。

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

return (myID << 16) & uniqueID++

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

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        【讨论】:

        • 不返回整数。格式为十六进制字符串,如20e8f3d6-3f8d-475b-8c19-9619a78bbdc8
        • @BalusC:这只是您正在谈论的字符串输出。 UUID 在内部是一个 128 位的值,因此可以解释为整数(尽管是 BigInteger)。
        • 不过,它不适合整数。
        【解决方案8】:

        你需要它吗?

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

        【讨论】:

        • Bill K. 给出了第一种情况的解决方案,即如果希望 id 在 2 个 JVM 之间是唯一的,可以做什么。即使在 JVM 重新启动后,确保 id 唯一的正确方法是什么?
        • 哦,从一个集中式数据库请求一个 uniqueId 也将在重新启动后工作。
        【解决方案9】:

        如果只需要 int,那么 AtomicInteger 就可以实现。

        如果需要字符串,那么下面的代码应该通过混合 timeStamp 和 原子长。

        AtomicLong idCounter =  new AtomicLong(100);
        long timestamp = System.currentTimeMillis();
        long nextLong = idCounter.incrementAndGet();
        String randomId = String.valueOf(timestamp)+String.valueOf(nextLong); 
        

        【讨论】:

          【解决方案10】:

          随时独一无二:

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

          【讨论】:

          • 引用this answerSystem.currentTimeMillis() 不会返回唯一值。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-04
          • 2023-03-15
          • 2010-11-30
          • 2013-03-11
          • 2018-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多