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

有帮助吗?

解决方案

它需要有多独特?

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

其他提示

int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

如果你希望它是线程安全的添加synchronized

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

如果你有一个线程,你只需要使用UNIQUEID ++;请务必保存当前UNIQUEID当您退出。

如果你有多个线程,一个公共同步generateUniqueID方法作品(实施与上述相同)。

的问题是,当你有许多CPU - 。在一个集群或一些分布式设置像一个对等网络游戏任

在这种情况下,通常可以结合两个部分,以形成一个单一的数字。例如,每个产生一个唯一的ID的过程可以有分配它自己的2字节的ID号码,然后用UNIQUEID ++相结合。是这样的:

return (myID << 16) & uniqueID++

它可以是棘手分发“本身份识别码”部,但也有一些方法。你可以只抓了一个集中的数据库,从中央服务器请求一个唯一的ID,...

如果你有一个长期的,而不是一个Int,在常用的招数之一是把设备ID接口eth0的(UUID),这是保证是唯一的一个服务器 - 那么只需添加一个序列号

如果你的真正用意整数而不是INT:

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

如果你想要的东西外可见一个JVM到其他进程或用户,持续的,或其他因素的主机,那么还有其他的方法,但是没有上下文,你可能最好使用使用内置的独特性系统内的对象的身份。

只需生成ID并检查它是否在已生成的ID列表已经存在或不存在。

你需要;

  • 独特之间的两Jvm运行 同一时间。
  • 独一无二的,即使如果JVM 重新启动。
  • 线的安全。
  • 支持空?如果不是,使用int或长。
 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();
        }
    }

}

希望这有助于你。

独特的在任何时间:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top