Подскажите алгоритм/библиотеку, может кто выложит готовую функцию для создания уникальных хешей размером 8-16 байт. Строковые значения у меня хранятся в базе данных, каждый день добавляется 300-500 тысяч записей, и база с каждым днем медленнее работает. Сперва хранил все в crc32 , все работало хорошо и быстро, но терялись уникальные строки... затем MD5 (повторений не было), но как показало время 32 байта для хеша в моем случае очень много как для моего диска так и для скорости работы базы. В общем ситуацию надеюсь растолковал. Заранее спасибо!
Я сейчас ковыряюсь с одной прогой и наткнулся на достаточно простой алгоритм создания хэша из 4 байт (на входе строка и ее размер). Впрочем, наверное, он для тебя мал?
А зачем его в символьном виде хранить? Храни его в нормальном виде и получишь как раз 16 байт. А вообще хеш-функций целый вагон и ещё тележка. Посмотри на эту тему Брюса Шнайера и его книгу "Прикладная криптография", в электронном виде есть. Там и исходники, и описание, и всё, что душе угодно. http://ru.wikipedia.org/wiki/Хеш-функция Глянь внизу списочек функций, поищи их описание(хотя всё это есть у Шнайера). Когда найдёшь наиболее подходящую под твои требования можно уже и о реализации поговорить.
10_Brasil MD5 и дает как раз 16 байт. Если нужно меньше, то почему бы не взять просто соответствующий вариант CRC, например CRC64?
500.000 записей Х 365 дней Х 5 лет = 2^30 записей -> Согласно парадоксу дней рождения, в первом приближении нужна хеш-сумма с пространством значений 2^60, чтобы вероятность коллизии была меньше 50% Округляем вверх -> получаем 64 бита. Я бы советовал просто взять первые 64 бита от MD5-значения (хранить - конечно же в двоичном виде, а не строковом). CRC все таки разрабатывался в первую очередь ради помехоустойчивости к искажениям, а не ради устойчивости к коллизиям - если не ошибаюсь, одинаковый CRC могут иметь 2 строки, отличающиеся всего в 2 битах "на неудачных позициях".