Генерация уникальных номеров отслеживания - PullRequest
3 голосов
/ 01 ноября 2009

Я создаю небольшое приложение для рельсов, и мне нужен способ генерирования номеров отслеживания, чтобы клиенты могли проверить их статус. Я хочу что-то похожее на то, что используют крупные судоходные компании, но не так долго. Я думаю, что 12-16 символов - это хорошо, но я не хочу что-то вроде 0000000001, где люди могут просто набирать увеличенные числа и заглядывать.

Что такое хороший способ создания уникальных кодов отслеживания комбинаций цифр / букв?

Ответы [ 5 ]

14 голосов
/ 01 ноября 2009

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

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()
'7a8b73fa7e0dadf246612e6001ede165'

Сократите, если хотите:

>>> hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:16]
'46ffb69ebc96412d'

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

>>> int(hashlib.md5(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1346212029197308

В до "zomg md5 не является криптобезопасным":

>>> int(hashlib.sha256(str(time.time()) + "!salt!").hexdigest()[:13], 16)
1948411134966366

Черт, вам даже не нужно использовать время, вы можете использовать целое число с автоинкрементом, пока вы его солите:

>>> int(hashlib.sha256(str(1) + "!salt!").hexdigest()[:13], 16)
1269883740611281
>>> int(hashlib.sha256(str(2) + "!salt!").hexdigest()[:13], 16)
3655373802716929

хэшей. Есть ли что-то, что они не могут сделать?

0 голосов
/ 01 ноября 2009

Я написал плагин для такого сценария, называемый activ_as_hashed ( на github ). Вы можете указать, какие поля вы хотите использовать в алгоритме хеширования, и плагин предоставит уникальный ключ на основе этих полей, называемый crypto_hash. Это, как правило, чище, чем делать это вручную, и может использоваться с любым количеством моделей в вашем приложении.

0 голосов
/ 01 ноября 2009
SELECT HEX(encode(id,'pass_str')) FROM table;
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str');
0 голосов
/ 01 ноября 2009

Почему бы не использовать хэш-карту для хранения информации о заказе и предоставить пользователям десятичное / шестнадцатеричное представление идентификатора? Это достаточно уникально.

0 голосов
/ 01 ноября 2009

Разве идентификатор не генерируется для каждой таблицы достаточно? Он уникален по умолчанию. Но в большинстве случаев это просто не отображается,

Конечно, его можно обернуть в метку времени или тому подобное.

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