生成唯一对象ID

时间:2016-05-25 06:35:26

标签: java class object uniqueidentifier

我正在尝试为类中的每个对象生成一个新的唯一标识符,而不使用static nextID字段来增加。使用它会在卸载和卸载程序时产生复杂性。

我想出了一个解决方法,用静态方法遍历对象,然后检查它们,但由于某些未知原因,它不会退出while循环。

我一直在ideone.com here中测试它,试图创建5个对象,但它甚至不会创建一个。

无需转到链接查看整个测试代码,下面是我正在使用的方法。

public static int newRandomID() {
    int randomID = 0;
    boolean notUnique = true;

    while (notUnique) {
        randomID = (int) (Math.random() * 999999 + 1);
        for (Example e : examples) {
            if (e.ID == randomID) {
                notUnique = true;
                break;
            }
            notUnique = false;
        }
    }
    return randomID;
}

我是否犯了一个愚蠢的错误,我太盲目无法看到,或者有没有理由不这样做?

3 个答案:

答案 0 :(得分:4)

如果你需要的只是一个唯一的标识符(不需要是顺序的)并且它必须是一个整数,那么看一下java.util.UUID

答案 1 :(得分:0)

你的notUnique有点混乱,我认为你在这里做错了

if (e.ID == randomID) {
            notUnique = true;
            break;
}
如果id存在,你不需要破坏语句。我改变了你的代码可能会有所帮助。

    int randomID = 0;
    boolean ContinueLoop = true;

    while (ContinueLoop) {
        randomID = (int) (Math.random() * 999999 + 1);
        boolean exist = false;
        for (Example e : examples) {
            if (e.ID == randomID) {
                exist = true;
            }else{
                exist = false;
                break;  
            }

        }

        if(exist==false){
            ContinueLoop = false;
        }else{
            ContinueLoop = true;
        }

    }
    return randomID;

答案 2 :(得分:0)

尝试执行您的代码(来自您发送的链接): 在您创建并打印了50个新ID之后,我尝试再生成150,000个:

for (int i = 0; i < 150000; i++)
        new Example();

并且...它的工作非常好!花了一分钟左右(这很有意义)。 如果我尝试只创建15,000条记录,它可以在不到一秒的时间内完成。

这使我得出结论,错过率是指数级高,并且一旦达到ids容量的15%就开始难以忍受。

不要继续这个解决方案。 使用不同的方法,例如存储的序号(如果存储记录)。如果你不存储记录,我就不会看到为什么不使用静态int变量。