Как сгенерировать уникальный идентификатор фиксированной длины в Java? - PullRequest
8 голосов
/ 05 июля 2011

Я пытаюсь сгенерировать уникальный идентификатор фиксированной длины, такой как идентификаторы, сгенерированные Megaupload для загруженных файлов.

Например:

  • ALGYTAB5
  • BCLD23A6

В этом примере, используя A-Z и 0-9 и с фиксированной длиной 8, общее количество различных комбинаций составляет 2 821 109 907 456.

Что если один из сгенерированных идентификаторов уже занят? Эти идентификаторы будут храниться в базе данных, и их не следует использовать более одного раза.

Как мне добиться этого на Java?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 05 июля 2011

Хмм ... Вы можете подражать меньшему GUID следующим образом.Пусть первые 4 байта вашей строки будут закодированным текущим временем - секундами, прошедшими после Unix.А последние 4 просто случайная комбинация.В этом случае единственный способ совпадения двух идентификаторов состоит в том, что они были созданы в одну секунду.И шансы на это были бы очень незначительными из-за других 4 случайных символов.

Псевдокод:

get current time (4 byte integer
id[0] = 1st byte of current time (encoded to be a digit or a letter)
id[1] = 2nd
id[2] = 3rd
id[3] = 4th
id[4] = random character
id[5] = random character
id[6] = random character
id[7] = random character
1 голос
/ 28 февраля 2014

Я попробовал решение @ Армена, но я хотел бы дать другое решение

    UUID idOne = UUID.randomUUID();
UUID idTwo = UUID.randomUUID();
UUID idThree = UUID.randomUUID();
UUID idFour = UUID.randomUUID();

String time = idOne.toString().replace("-", "");
String time2 = idTwo.toString().replace("-", "");
String time3 = idThree.toString().replace("-", "");
String time4 = idFour.toString().replace("-", "");

StringBuffer data = new StringBuffer();
data.append(time);
data.append(time2);
data.append(time3);
data.append(time4);

    SecureRandom random = new SecureRandom();
int beginIndex = random.nextInt(100);       //Begin index + length of your string < data length
int endIndex = beginIndex + 10;            //Length of string which you want

String yourID = data.substring(beginIndex, endIndex);

Надеюсь, эта помощь!

0 голосов
/ 11 января 2019

Выполните следующие действия:

  1. generateId ()
  2. Проверьте, уже выдан ли он при запросе к базе данных.
  3. Если да, снова вызовите generateId ()пока не найдешь в db
0 голосов
/ 05 июля 2011

Похоже на работу для хэш-функции .Вы не на 100% гарантированы, что хеш-функция вернет уникальный идентификатор, но большую часть времени она работает.Хеш-коллизии должны рассматриваться отдельно, но есть много стандартных методов, на которые вы должны обратить внимание.

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

0 голосов
/ 05 июля 2011

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

Вы также можете взглянуть на класс UUID (хотя это 16-байтовые UUID).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...