代码生成唯一数量的包装器对象Long类型

时间:2014-07-02 12:42:27

标签: java java-ee

我想创建一个独特的" Long"使用java键入。我见过几个例子,但他们使用时间戳,不使用时间戳,我可以创建一个唯一数量的包装器对象" Long" 。请建议。

请建议。谢谢。

7 个答案:

答案 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)

不使用时间戳,您有以下选项:

  1. 记录所有以前生成的数字 - 当然你必须把它们存放在某个地方,这是笨重的
  2. 存储上一个号码,并每次递增。
  3. 简单地假设PRNG永远不会两次提出相同的数字。由于有2 ^ 64 == 1.8 * 10 ^ 19个可能的值,这是一个非常安全的赌注。

答案 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)

尝试使用UUID

  Long uniqueLong = UUID.randomUUID().getMostSignificantBits();

Here,您可以找到一个非常好的解释,为什么这在随机性方面可能是唯一的。