2009-11-01 6 views
3

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

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

+0

хэширование общего пути? – ukanth

+0

Подумайте о base32 или base64, кодируя код, если вы хотите уменьшить количество символов в ID. – Artelius

ответ

14

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

>>> 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

спасибо, это то, что я хотел делать. – Joey

+0

@Joey: Тебе очень рады. Приветствия. –

+4

Если вы хотите иметь некоторую информацию о сроках, встроенную в номер отслеживания, вы можете префикс вашего случайного хэша с помощью первых нескольких цифр unix-time в десятичной форме. Первые 6 цифр будут однозначно идентифицировать время примерно до 3-х часового периода. Это добавило бы эффект, чтобы ваши коды отслеживания были полупоследовательными (что, например, обеспечивало бы полезные свойства при сортировке записей). – Wedge

0

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

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

0

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

0
SELECT HEX(encode(id,'pass_str')) FROM table; 
SELECT * FROM table WHERE id=decode(UNHEX('1F68C22821F2AC'), 'pass_str'); 
0

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