【发布时间】:2011-01-11 20:21:07
【问题描述】:
如何在java中生成唯一的整数ID,不会猜测下一个数字?
【问题讨论】:
-
也许您应该更准确地了解您的需求背景。
标签: java uniqueidentifier uid
如何在java中生成唯一的整数ID,不会猜测下一个数字?
【问题讨论】:
标签: java uniqueidentifier uid
它需要有多独特?
如果它仅在进程中是唯一的,那么您可以使用 AtomicInteger 并在每次需要新值时调用 incrementAndGet()。
【讨论】:
if (curInt == Integer.MAX_INT) reset atomicInteger
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++;请务必在退出时存储当前的唯一 ID。
如果你有多个线程,一个通用的同步 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 之外对其他进程或用户可见、持久性或许多其他考虑因素,那么还有其他方法,但如果没有上下文,您可能最好使用内置的唯一性系统中的对象标识。
【讨论】:
只需生成 ID 并检查它是否已经存在于您生成的 ID 列表中。
【讨论】:
【讨论】:
20e8f3d6-3f8d-475b-8c19-9619a78bbdc8。
你需要它吗?
【讨论】:
如果只需要 int,那么 AtomicInteger 就可以实现。
如果需要字符串,那么下面的代码应该通过混合 timeStamp 和 原子长。
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);
【讨论】:
System.currentTimeMillis() 不会返回唯一值。