реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Хеш-функция для БД
vladik
сообщение Dec 16 2010, 10:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-05-06
Пользователь №: 17 226



Добрый день.

Ситуация следующая: есть данные ~ 20 байт.
Им необходимо поставить в соответствие некоторый хеш-код.
Естественно хочется чтобы он был как можно меньше.

Какие есть формулы расчета, чтобы найти компромисс между размером хеша и вероятностью коллизий?
Ну и если из опыта что-то подскажете (какой хеш использовали и для каких данных) тоже буду благодарен.

P.S. полагаю CRC32 использовать для такого - слишком избыточно sm.gif

Сообщение отредактировал vladik - Dec 16 2010, 10:23
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Dec 16 2010, 12:11
Сообщение #2





Guests






Вкуривать "парадокс дней рождения"

вероятность коллизии
p <= 0.5*n*(n-1)*2^-m

n - число уникальных слов
m - разрядность hash-функции

Т.е. вероятность коллизии для двух слов равна 1/2^32
А вот сколько реально у вас слов (размер входного множества) - знаете только Вы.

Если опять непонятно, то..
Если размер вашего словаря 2^160 слов, т.е. используются все комбинации из 160 бит ( 20*8), то сами подумайте насчет вероятности

Ну и уж совсем просто:
Если есть n-разрядное двоичное число и число используемых комбинаций максимально и есть хеш-функция разрядностью m, то вероятность коллизии

p <= 2^(2*n-m)
Go to the top of the page
 
+Quote Post
Petr_I
сообщение Dec 23 2010, 15:02
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 129
Регистрация: 28-09-10
Из: Москва
Пользователь №: 59 793



Цитата(vladik @ Dec 16 2010, 16:22) *
Какие есть формулы расчета, чтобы найти компромисс между размером хеша и вероятностью коллизий?
Ну и если из опыта что-то подскажете (какой хеш использовали и для каких данных) тоже буду благодарен.


А какова конечная цель?
Оптимизировать поиск по базе данных?
Процессор какой?
Потенциальное количество записей в базе?

От этого и будут зависеть рекомендации.
Может достаточно первый байт использовать вместо хэша.
Go to the top of the page
 
+Quote Post
Daddy Torque
сообщение Feb 21 2011, 14:28
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 21-09-08
Из: СПб
Пользователь №: 40 369



Цитата(vladik @ Dec 16 2010, 13:22) *
Ситуация следующая: есть данные ~ 20 байт.
Им необходимо поставить в соответствие некоторый хеш-код.
Естественно хочется чтобы он был как можно меньше.
P.S. полагаю CRC32 использовать для такого - слишком избыточно sm.gif


CRC - не плох, если CRC32 по-вашему слишком жирно, используйте CRC16 или CRC8 или просто нужное количество битов от любого из вышеназванных CRC. Т.к. здесь свойства CRC не важны, а важно только построить какое-нибудь отображение, то можно и более простой алгоритм использовать, например просто XOR-ить фрагменты сообщения (например по 32 бита), а потом, опять же, отрезать достаточное в вашей ситуации кол-во битов.
Ну а коллизии - конечно могут быть... правильно было сказано про парадокс дней рождения.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Feb 21 2011, 14:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(vladik @ Dec 16 2010, 13:22) *
Им необходимо поставить в соответствие некоторый хеш-код.
Естественно хочется чтобы он был как можно меньше.


Минимально возможный размер хеш-кода есть 1 бит. Вам пойдет?

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


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016