Уникальный серийный номер в веб-приложении Java - PullRequest
2 голосов
/ 23 декабря 2010

Мне было интересно, как правильно генерировать уникальные идентификаторы? Дело в том, что в моем веб-приложении у меня будет система плагинов, когда пользователь регистрирует плагин, я хочу создать для него уникальный серийный идентификатор. Я думал о сохранении всех чисел в БД или файле на сервере, создании случайного числа и проверке, существует ли оно уже в БД / файле, но это не кажется таким уж хорошим. Есть ли другие способы сделать это? Будет ли предпочтительнее использовать UUID?

Ответы [ 3 ]

7 голосов
/ 23 декабря 2010

Если идентификаторы обращены к пользователю, как кажется, то вы хотите, чтобы их было сложно угадать.Используйте встроенный класс UUID , который генерирует случайные идентификаторы для вас и может форматировать их для вас.Извлечение:

UUID idOne = UUID.randomUUID();
UUID idTwo = UUID.randomUUID();
log("UUID One: " + idOne);
log("UUID Two: " + idTwo);

Пример вывода:

UUID One: 067e6162-3b6f-4ae2-a171-2470b63dff00 
UUID Two: 54947df8-0e9e-4471-a2f9-9af509fb5889

В приведенной ссылке есть и другие решения.Я думаю, что он достаточно хорошо сравнивает методы, поэтому выберите тот, который наилучшим образом соответствует вашим потребностям.

Еще один интересный метод - тот, который MongoDB использует, но это, возможно, излишне для ваших нужд:

BSID ObjectID - это 12-байтовое значение, состоящее из 4-байтовой метки времени (секунды с начала эпохи), 3-байтового идентификатора компьютера, 2-байтового идентификатора процесса и 3-байтового счетчика.,Обратите внимание, что поля меток времени и счетчика должны храниться с прямым порядком байтов в отличие от остальной части BSON

Если они не были обращены к пользователю, то вы можете просто оставить его в базе данных для автоматического увеличения идентификатора: 1, 2, 3 и т. Д.

0 голосов
/ 23 декабря 2010

Вы могли бы основывать его на ID пользователя и метке времени, обеспечивая уникальность, а также обеспечивая определенную «читабельность»? Например. Идентификатор пользователя = 101, отметка времени = 23 декабря 2010 г. 13:54, вы можете присвоить ему идентификатор:

201012231354101

или

101201012231354

Альтернативный UUID, очевидно, гарантированно уникален, но занимает много места в БД и довольно громоздок для работы.

Последняя идея - запросить у вашей центральной БД уникальный идентификатор, например, В Oracle есть последовательности, или MySQL использует поля AUTO_INCREMENT для назначения уникальных целых чисел.

0 голосов
/ 23 декабря 2010

Почему бы не использовать статический (или, в данном случае, контекстно-зависимый) AtomicInteger, который будет увеличиваться при регистрации плагина?

...