如何在Java中生成不可预测的整数唯一标识符?
如何在Java中生成不可预测的整数唯一标识符?
需要多独特?
如果它只需要在一个进程中是独特的,那么你可以使用AtomicInteger
并且每次需要新值时调用incrementAndGet()
。
if (curInt == Integer.MAX_INT)
,则重置 atomicInteger。 - Dmitry Zagorulkinint 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。
如果有多个线程,可以使用常见的同步生成唯一ID的方法(与上述实现相同)。
问题是当你拥有许多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
。 - BalusC你需要它是:
假设你有一个名为“员工”的类,具有以下属性:
public class Employee {
private final String name;
private int id;
private static int nextID = 1;
public Employee(String name) {
this.name= name;
id = nextID++;
}
}
非常简单
如果只需要 int,那么 AtomicInteger 可以实现。
如果需要 String,则可以通过混合 timeStamp 和 AtomicLong 来使用下面的代码。
AtomicLong idCounter = new AtomicLong(100);
long timestamp = System.currentTimeMillis();
long nextLong = idCounter.incrementAndGet();
String randomId = String.valueOf(timestamp)+String.valueOf(nextLong);