Создание уникальной буквенно-цифровой строки из 10 символов - PullRequest
8 голосов
/ 22 января 2009

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

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

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

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

Ответы [ 7 ]

4 голосов
/ 22 января 2009

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

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

3 голосов
/ 22 января 2009

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

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

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

2 голосов
/ 22 января 2009

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

2 голосов
/ 22 января 2009

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

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

<p>foreach (1..22) 
  {
    # rand @chars will generate a random 
    # number between 0 and scalar @chars
    $random_string .= $chars[rand @chars];
  }
  return $random_string . "-" . time();
}

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

1 голос
/ 22 января 2009

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

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

0 голосов
/ 04 февраля 2010

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

0 голосов
/ 22 января 2009

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

...