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

StackOverflow https://stackoverflow.com/questions/317617

  •  11-07-2019
  •  | 
  •  

Вопрос

Я хотел бы написать утилиту, которая предоставит мне относительно уникальный идентификатор в 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++;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top