java - 如何在java中生成不猜测下一个数字的整数唯一ID?
10 回答
它需要有多独特?
如果它仅在进程中是唯一的,那么您可以在每次需要新值时使用AtomicInteger
并调用。incrementAndGet()
int uniqueId = 0;
int getUniqueId()
{
return uniqueId++;
}
synchronized
如果您希望它是线程安全的,请添加。
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();
}
}
}
希望这对您有所帮助。
如果您受到一些限制,这很容易。
如果你有一个线程,你只需使用 uniqueID++;退出时请务必存储当前的 uniqueID。
如果您有多个线程,则可以使用常见的同步 generateUniqueID 方法(实现与上述相同)。
问题是当你有很多 CPU 时——要么在集群中,要么在一些分布式设置中,比如点对点游戏。
在这种情况下,您通常可以将两个部分组合成一个数字。例如,每个生成唯一 ID 的进程都可以分配自己的 2 字节 ID 号,然后将其与 uniqueID++ 组合。就像是:
return (myID << 16) & uniqueID++
分发“myID”部分可能很棘手,但有一些方法。您可以从集中式数据库中获取一个,从集中式服务器请求一个唯一 ID,...
如果你有一个 Long 而不是 Int,一个常见的技巧是获取 ETH0 的设备 ID (UUID),这保证对服务器来说是唯一的——然后只需添加一个序列号。
如果你真的是指整数而不是整数:
Integer id = new Integer(42); // will not == any other Integer
如果您希望某些东西在 JVM 之外对其他进程或用户可见、持久性或许多其他考虑因素,那么还有其他方法,但如果没有上下文,您最好使用对象身份的内置唯一性你的系统。
你需要它吗?
- 在同时运行的两个 JVM 之间是唯一的。
- 即使 JVM 重新启动也是唯一的。
- 线程安全的。
- 支持空吗?如果没有,请使用 int 或 long。
只需生成 ID 并检查它是否已经存在于您生成的 ID 列表中。
如果只需要 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);
任何时候都独一无二:
int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);