Генерация уникального N-значного ключа - PullRequest
2 голосов
/ 27 марта 2010

Я хочу создать уникальный случайный, N-значный ключ. Этот ключ может содержать цифры и латинские символы, то есть A-Za-z0-9.

Единственное решение, о котором я думаю, это что-то вроде этого (псевдокод):

key = "";
smb = "ABC…abc…0123456789"; // allowed symbols
for (i = 0; i < N; i++) {
    key += smb[rnd(0, smb.length() - 1)]; // select symbol at random position
}

Есть ли лучшее решение? Что вы можете предложить?

Ответы [ 5 ]

3 голосов
/ 27 марта 2010

Я бы посмотрел на GUID с. Из статьи в Википедии «основная цель GUID - иметь абсолютно уникальный номер», который звучит точно так же, как вы ищете. Существует несколько реализаций, которые генерируют идентификаторы GUID, поэтому, скорее всего, вам не придется изобретать велосипед.

1 голос
/ 27 марта 2010

Что бы вы ни делали, если вы создадите ключ, который использует все цифры и все буквы, и если человек когда-нибудь увидит этот ключ (что, вероятно, если вы используете цифры и буквы), опустить символы l, I, 1, O и 0. Люди их запутывают.

Ничто в вашем посте не затрагивает вопрос уникальности 1011 *. Вам понадобится способ не генерировать один и тот же ключ дважды. Обычно, когда мне нужен уникальный ключ, у меня есть некоторая уникальная информация для начала. Я обычно беру односторонний хеш , такой как MD5, тогда есть способы преобразовать его в ключ с различной степенью читабельности:

  • Конвертировать в гекс
  • Base64 кодировать его
  • Используйте биты ключа для индексации списка слов.

Пример: уникальная строка, вычисленная путем хэширования части этого ответа над горизонтальной линией, равна

Брэггерский плавник похищения

1 голос
/ 27 марта 2010

Помня о том, что вся область криптографии зависит, среди прочего, от случайных чисел.Поэтому АНБ, ЦРУ и некоторые из лучших математиков в мире работают над этим, поэтому я гарантирую вам, что есть лучшие идеи.

Я?Я просто сделал бы то, что предлагает fbrereto, и просто получил бы гид.Или загляните в генераторы криптографических ключей, или, знаете ли, какие-нибудь лавовые лампы и камеру.в зависимости от языка может потребоваться заполнить ГСЧ, иначе он будет генерировать один и тот же ключ каждый раз.

0 голосов
/ 27 марта 2010

Предполагая, что вы используете язык / библиотеку без совершенно пафосного генератора случайных чисел, все, что у вас есть, выглядит довольно хорошо. N символов, равномерно распределенных по разумному алфавиту, работают для меня, и никакое применение более изящного кода вряд ли сделает его более случайным (просто медленнее).

(Для записи, патетическим будет включать отбрасывание старших битов базовых случайных чисел при выборе значения из заданного диапазона. Хотя в идеале все RNG должны делать каждый бит одинаково случайным, на практике это не так; биты порядка имеют тенденцию быть более случайными. Это означает, что оператор модуля совершенно не подходит для фиксации в ограниченном диапазоне.)

0 голосов
/ 27 марта 2010

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

...