Как я могу собрать биты в длинный, чтобы создать уникальный идентификатор? - PullRequest
1 голос
/ 25 ноября 2008

Я хотел бы написать утилиту, которая предоставит мне относительно уникальный идентификатор в Java. Что-то довольно простое, например, x бит из отметки времени + y бит из случайного числа.

Итак, как бы мне реализовать следующий метод:

long getUniqueID()
{
    long timestamp = System.currentTimeMillis();
    long random = some random long

    ...

    return id;
}

БОНУС

Какие-либо предложения для другой легко доступной информации, которую я мог бы использовать, чтобы сформировать мой идентификатор?

примечание: мне известны GUID, и я знаю, что в Java есть класс UUID, но я не хочу что-то длиной 128 бит.

Ответы [ 3 ]

3 голосов
/ 25 ноября 2008

Просто обрежьте ненужные биты:

return java.util.UUID.randomUUID().getLeastSignificantBits();
1 голос
/ 26 ноября 2008

Если уникальности в той же JVM достаточно, то что-то вроде этого должно сделать работу

public class UniqueID {
  static long current= System.currentTimeMillis();
  static public synchronized long get(){
    return current++;
    }
}
1 голос
/ 25 ноября 2008

То, что вы пытаетесь сделать, - это создать хэш-функцию , которая объединяет два длинных значения в одно длинное значение. В этом случае единообразие хеш-функции будет иметь первостепенное значение, поскольку коллизии в созданных уникальных значениях ID недопустимы. Однако, если вы можете сравнить значения хеш-функции с ранее созданными идентификаторами, тогда конфликты можно разрешать, изменяя хеш-код до тех пор, пока не возникнет конфликт.

Например, вы можете взять отметку времени и выполнить exclusive-or (используя оператор caret ^ в Java) со случайным значением. Если обнаружено столкновение, добавьте его к результату.

...