Создание уникальной буквенно-цифровой 10-символьной строки

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

  •  19-08-2019
  •  | 
  •  

Вопрос

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

  • уникальный
  • случайный вид
  • буквенно - цифровой
  • короткий, по крайней мере, намного короче строк длиной в 32 символа, возвращаемых sha1

Я рассчитываю всего на ~ 500 бронирований, так что я не представьте себе высокая вероятность столкновений.

Одна из моих идей - сгенерировать хэш sha1 на основе метки даты и времени и имени пользователя, затем обрезать его до первых 10 символов.Будет ли что-то подобное достаточно надежно уникальным для целей обработки ~ 500 бронирований?

Это было полезно?

Решение

Не должно быть никакой разницы в случайности любого данного бита хэша SHA-1, так что это возможно.Другим способом было бы объединить хэш в себя с помощью XOR до тех пор, пока у вас не будет данных на 60 бит, затем закодировать их с помощью База 64 чтобы получить в основном буквенно-цифровой результат.

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

Другие советы

Вы можете использовать что угодно, даже обычный генератор случайных чисел;однако вам следует убедиться, что код бронирования еще не указан.Если это так, добавляйте символы ('x') в строку (дата + пользователь), пока не получите новый random/sha1/etc.

Я рассчитываю всего на ~ 500 бронирований, так что я не представляю себе высокой вероятности столкновений.

Еще одна глупая идея:сгенерируйте 1000 или 2000 уникальных случайных чисел с желаемыми свойствами, сохраните их где-нибудь и назначьте пользователям по мере их регистрации :)

Вот один из способов сделать это в Perl:

sub get_random_name()
{
  my @chars=('a'..'z','A'..'Z');
  my $random_string;

foreach (1..22) { # rand @chars сгенерирует случайное # число от 0 до скалярных символов $random_string .= $chars[ранд @символы];} возвращает $random_string ."-" .время();}

Я не помню, какой длины часть time(), поэтому вам, возможно, придется скорректировать цифры в соответствии с вашей длиной.Вы также можете удалить эту деталь, если она вам не нужна.

Если это действительно всего 500, то предварительно сгенерируйте 20 000 из них в таблицу, а затем получите "следующий неиспользуемый", когда вам это понадобится.

Несколько хороших советов по этому вопросу: Как мне создать случайную буквенно-цифровую строку в C ++?

Я бы не стал включать в вашу строку такие символы, как "1", "l" и "O", "0" и "5", "S" и "Z", "2", чтобы клиентам было проще, когда им нужно прочитать ваш код бронирования по телефону.Алгоритм, представленный по этой ссылке, должен помочь вам сделать это.

использовать guid?16 символов, хотя, если вас действительно не волнует столкновение, вы могли бы просто выбрать первые n символов.

В C # вы можете использовать http://www.dotnetfunda.com/forums/thread1357-how-do-generate-unique-alpha-numeric-random-number-in-aspnet.aspx (говорят, это очень простой способ)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top