Алгоритмы, которые могут взять строку длиной N и вернуть уникальное значение фиксированного размера? - PullRequest
2 голосов
/ 27 июня 2010

Я хочу добавить базовое лицензирование в мое приложение. Я хочу взять имя пользователя в качестве параметра и вернуть уникальный код фиксированной длины (вроде MD5)

Какие алгоритмы могут это сделать? Спасибо

Ответы [ 4 ]

5 голосов
/ 27 июня 2010

Алгоритмы SHA должны подходить для этого (SHA-1, SHA-512 и т. Д.). Они используются во многих местах, где MD5 также может быть использован, но, кажется, более уважаемы. Я использую их для хеширования паролей, но звучит так, как будто их функциональность в качестве одностороннего хэша тоже подойдет для этого.

Если вы хотите иметь фиксированный размер, вы можете затем Base64 кодировать результирующие байты и взять первые N цифр, которые вы хотите. Даже при том, что вы теряете часть исходного хэша, это должно дать вам достаточно большой набор различных возможных ключей, которые вам практически невозможно повторить. В качестве системы отсчета это пример UUID в кодировке Base64: "iFHqaiNjhTDpxp7ahBPX0A"

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

2 голосов
/ 27 июня 2010

Соглашаясь с предыдущими предложениями хэшей MD5 или SHA1 для генерации уникальных кодов, вы также можете позаботиться о том, чтобы эти коды не могли быть легко перепроектированы. В вашем приложении, если имена пользователей (основа для кодов) были общедоступны, то злоумышленник (зная или угадывая ваш алгоритм) может сам создать коды.

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

1 голос
/ 27 июня 2010

Простой алгоритм состоит в том, чтобы возвести n-е простое число в степень алфавитного значения (a = 1, b = 2, ...) i-го символа в имени пользователя.См. Номера Годеля .

Пример

Имя пользователя: Peter

Уникальный код: 2 ^ 16 + 3 ^ 5 +5 ^ 20 + 7 ^ 5 + 11 ^ 18 = 5560012680923954692

0 голосов
/ 27 июня 2010

Похоже, что простой 32- или 64-битный CRC будет работать.Теоретические шансы на столкновение намного выше, чем с MD5 / SHA1 и т. Д., Но практически, сколько лицензий вы будете генерировать?Несколько десятков тысяч?И учитывая, что вы используете имена в качестве входных данных (единственный вход?), Вы почти наверняка столкнетесь из-за коллизий в исходных данных.

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