2012-06-19 2 views
2

У меня есть более 100 миллионов уникальных строк (VARCHAR (100) УНИКАЛЬНО в базе данных MySQL). Теперь я использую следующий код для создания уникального хеша из них (VARCHAR (32) UNIQUE), чтобы восстановить индексный индекс таблицы InnoDB (уникальный индекс на varchar (100) примерно в 3 раза больше, чем на поле varchar (32)).Python кратчайший уникальный идентификатор из строк

id = hashlib.md5(str).hexdigest() 

Есть ли какой-либо другой способ создания более коротких идентификаторов из этих строк и обеспечения разумных гарантий уникальности?

+0

SHA1? Обратите внимание, что вы можете сделать строки короче, используя базовую версию дайджеста, а не шестую: 'base64.b64encode (hashlib.md5 (« foo »). Digest())' –

+1

Вы можете использовать BINARY (16), чтобы сохранить хэш MD5 без кодировки hex или base64. –

ответ

3

Один грубый способ может быть, вы можете сделать md5, а затем выбрать первые 16 символов из него, а не всех 32. Столкновения все еще не будут такими высокими, и у вас будет разумная гарантия уникальности.

2

Простейшие решения заключаются в том, чтобы преобразовать шестнадцатеричные данные (yore digests имеют базу 16) в нечто другое, например. с базой 64.

Если вы согласны с некоторым уровнем более высокого риска, вы можете использовать только, например, первые десять цифр (шестнадцатеричный) дайджеста. Он даст вам 16**10 (более 10**12) возможностей вместо 16**32 (более 10**38), но он по-прежнему огромен и обычно используется в технике (Git и Github обычно используют 7 цифр для идентификации фиксаций, afair).

+0

КПП. MD5, закодированный с использованием base64, имеет 22 символа, и у вас есть такая же информация, что и у raw MD5. Если вы перейдете от 32 до 22 символов, то это нормально. – Tadeck

0

Поскольку хеширование и сжатие очень похожи, очевидным решением является использование алгоритма сжатия для сжатия ваших ключей. Это также сохранит уникальность клавиш.

+0

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

+0

Пожалуйста, проверьте [this] (http://stackoverflow.com/questions/1138345/best-compression-algorithm-for-short-text-strings) и [это] (http://stackoverflow.com/questions/1192732/really-simple-short-string-compression) сообщения – klearn

4

Вы можете сохранить его как целое:

id_ = int(hashlib.md5(your_str).hexdigest(), 16) 

или как двоичную строку:

id_ = hashlib.md5(your_str).digest() 
Смежные вопросы