Генерация номеров подтверждения - PullRequest
4 голосов
/ 03 декабря 2009

Мне нужна методика (указатель на пример кода, если он у вас есть) для генерации конформационных номеров для веб-платежей. Я не хочу, чтобы клиент записывал длинную последовательность, такую ​​как GUID, но я не хочу, чтобы она также легко прогнозировалась.

Использование C #

Спасибо за все советы. Я выбрал формат, подобный этому:

TdddRROOO

T = 2009 (следующий год будет U = 2010) ддд = дни в этом году RR = два случайных числа 000 = номер заказа (я зачеркну это, чтобы люди не могли знать номер заказа в тот день)

Так что номер подтверждения будет примерно таким P23477098

Ответы [ 6 ]

3 голосов
/ 03 декабря 2009

Вы могли бы что-то сделать со смесью. Сгенерируйте первую половину ключа как известное предсказуемое значение (например, 00001, 00002, 00003 и т. Д.), А затем сгенерируйте вторую половину как случайно сгенерированное значение, чтобы оно не было предсказуемым. Затем увеличьте «известное, предсказуемое» значение, чтобы никогда не получить совпадение.

Ваш уникальный код станет: 00001-53481, 00002-43853, 00003-54511 и т. Д.

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

2 голосов
/ 04 декабря 2009

Я недавно сделал то же самое в PHP. Мы используем случайную функцию в этом классе,

https://gallery.svn.sourceforge.net/svnroot/gallery/trunk/eval/gx/kohana/kohana/helpers/text.php

Мы используем random('distinct', 8) для генерации номера подтверждения. Он генерирует строки, подобные этой,

4CFY24HJ
JH5AYL7J
2TVWTMJ5

Как вы можете видеть, в нем нет запутанных цифр / букв, таких как (1/1, 0 / O и т. Д.), Поэтому становится намного понятнее, когда клиентам приходится читать цифры по телефону.

1 голос
/ 03 декабря 2009

Выберите нужные символы (char[] chars) в коде подтверждения, определите длину кода подтверждения (n), сгенерируйте n случайных чисел (i_1, i_2, ..). . i_n) в диапазоне [0..chars.Length) и вернуть строку chars[i_1]chars[i_2]...chars[i_n].

В C #:

public string ConfirmationCode(char[] chars, int length, Random rg) {
    StringBuilder codeBuilder = new StringBuilder();
    for(int i = 0; i < length; i++) {
        int index = rg.Next(chars.Length);
        codeBuilder.Append(chars[index]);
    }
return codeBuilder.ToString();

Для уникальности добавьте текущее время в формате yyyyMMddhhmmss.

0 голосов
/ 03 декабря 2009

Как насчет PayPhrase от Amazon? Используйте такую ​​библиотеку, как Faker (Ruby) или Data :: Faker (Perl), чтобы генерировать случайные фразы, или напишите свою собственную утилиту. Затем просто используйте простую хэш-функцию для преобразования «фразы подтверждения» в число, которое вы можете индексировать.

Что касается C #, существует портовый рубиновый гем Faker в http://github.com/slashdotdash/faker-cs

0 голосов
/ 03 декабря 2009

Вы можете сделать что-то вроде получения случайного числа указанной длины, конвертировать в base64 и добавить символ контрольной суммы.

0 голосов
/ 03 декабря 2009

Просто сгенерируйте случайное число, например, от 100000 до 999999. Также хорошей идеей является поставить перед собой несколько букв, которые идентифицируют его как номер подтверждения, например, CONF-843682, чтобы люди могли легче его узнать, когда вы попросите его.

Сохраните номер в базе данных вместе с идентификатором заказа и датой истечения срока действия (скажем, 1 год).

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