我想创建一个独特的" Long"使用java键入。我见过几个例子,但他们使用时间戳,不使用时间戳,我可以创建一个唯一数量的包装器对象" Long" 。请建议。
请建议。谢谢。
答案 0 :(得分:1)
通过调用random.nextInt生成每个数字。为了保持唯一性,您可以通过将它们保存在一个集合中来检查您目前使用的随机数,并检查该集合是否包含您每次生成的数字。
public static long generateRandom(int length) {
Random random = new Random();
char[] digits = new char[length];
digits[0] = (char) (random.nextInt(9) + '1');
for (int i = 1; i < length; i++) {
digits[i] = (char) (random.nextInt(10) + '0');
}
return Long.parseLong(new String(digits));
}
答案 1 :(得分:1)
不使用时间戳,您有以下选项:
答案 2 :(得分:1)
许多答案建议使用Math.random()
生成唯一ID。现在Math.random()
实际上根本不是随机的,并且本身并没有添加任何独特的东西。看似唯一性来自Math.random()
基于System.currentTimeMillis();
的默认种子,代码如下:
/**
* Construct a random generator with the current time of day in milliseconds
* as the initial state.
*
* @see #setSeed
*/
public Random() {
setSeed(System.currentTimeMillis() + hashCode());
}
那么为什么不从方程中删除Math.Random()
,只需在计数器中使用System.currentTimeMillis()
。
以下代码严格按时实现唯一编号生成器。这样做的好处是您不需要存储任何计数器等。在以下条件下生成的数字将是唯一的:代码只能在任何时间在一个JVM中运行 - 这很重要,因为时间戳是密钥的一部分。
public class UniqueNumber {
private static UniqueNumber instance = null;
private long currentCounter;
private UniqueNumber() {
currentCounter = (System.currentTimeMillis() + 1) << 20;
}
private static synchronized UniqueNumber getInstance() {
if (instance == null) {
instance = new UniqueNumber();
}
return instance;
}
private synchronized long nextNumber() {
currentCounter++;
while (currentCounter > (System.currentTimeMillis() << 20)) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
}
return currentCounter;
}
static long getUniqueNumber() {
return getInstance().nextNumber();
}
}
该代码允许每毫秒生成最多2 ^ 20个数字(前提是您可以访问该快速硬件)。如果超过此速率,代码将一直睡到下一个System.currentTimeMillis()
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(UniqueNumber.getUniqueNumber());
}
}
1472534126716256257
1472534126716256258
1472534126716256259
1472534126716256260
1472534126716256261
1472534126716256262
1472534126716256263
1472534126716256264
1472534126716256265
1472534126716256266
答案 3 :(得分:0)
看看这个Commons Id,它有LongGenerator生成一个递增的数字作为Long对象。
答案 4 :(得分:0)
这将只创建一个随机长号 -
System.out.println((long)((Math.random())*1000000000000000000L));
答案 5 :(得分:0)
您可以使用java.util.Random
生成随机数并将其添加到java.util.Set
,这样可以确保不允许重复
答案 6 :(得分:0)