Как я могу собрать биты в long, чтобы создать уникальный идентификатор?
Вопрос
Я хотел бы написать утилиту, которая предоставит мне относительно уникальный идентификатор в Java.Что-то довольно простое, например, x бит из метки времени + y бит из случайного числа.
Итак, как бы мне реализовать следующий метод:
long getUniqueID()
{
long timestamp = System.currentTimeMillis();
long random = some random long
...
return id;
}
БОНУС
Есть какие-либо предложения по другой легкодоступной информации, которую я мог бы использовать для формирования своего удостоверения личности?
примечание:Я осведомлен о GUID, и я знаю, что в Java есть класс UUID, но я не хочу что-то длиной в 128 бит.
Решение
Просто отрежьте ненужные кусочки:
return java.util.UUID.randomUUID().getLeastSignificantBits();
Другие советы
То, что вы пытаетесь сделать, это создать хэш - функция это объединяет два длинных значения в одно длинное значение.В этом случае, единообразие выбор хэш-функции будет иметь первостепенное значение, поскольку коллизии в созданных уникальных значениях идентификаторов недопустимы.Однако, если вы можете сравнить значения хэша с ранее созданными идентификаторами, то коллизии могут быть разрешены путем изменения хэша до тех пор, пока коллизии не возникнут.
Например, вы могли бы взять временную метку и выполнить эксклюзивный-или (используя оператор caret ^ в Java) со случайным значением.Если обнаружено столкновение, добавьте его к результату.
Если уникальности в одной и той же JVM достаточно, то что-то вроде этого должно выполнить эту работу.
public class UniqueID {
static long current= System.currentTimeMillis();
static public synchronized long get(){
return current++;
}
}