Вопрос по встроенной функции HASH()
Привет, All Вот такой вот запрос: == SELECT M.HASHKEY, COUNT(1) FROM ( select hash('р-р д/ин. 0 мг шприц 0,0 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 10 мг шприц 0,1 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 20 мг шприц 0,2 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 30 мг шприц 0,3 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 40 мг шприц 0,4 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 50 мг шприц 0,5 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 60 мг шприц 0,6 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 70 мг шприц 0,7 мл') as hashkey from rdb$database union all select hash('р-р д/ин. 80 мг шприц 0,8 мл') as hashkey from rdb$database) AS M GROUP BY 1 Выдаст наличие совпадений по значению хеша, хотя строки все отличаются. Я понимаю, что вероятность совпадения значений хеша при разных входных данных допускается, но не такая же большая. Какой алгоритм для получения хеша используется и есть ли возможность выбирать алгоритмы, - ну например: разные алгоритмы - разные названия функций, или все-таки UDF нам поможет? :) -- Версия FB 2.5.0.26074
Re: Вопрос по встроенной функции HASH()
>> 05.10.2011 0:51, Roman Yaroshenko пишет: Да, FB 2.5.1.26308, если подключение и строки win1251 совпадения есть, UTF8 нет.
Re: Вопрос по встроенной функции HASH()
Привет! Там (насколько я помню) простой CRC48 или что-то похожее. Совпадения достаточно часто встречаются, если строки отличаются чётным количеством байт (по крайней мере у меня было именно так). Лучше всего использовать SHA1/MD5, благо все есть в исходниках и сделать UDF из них в простом случае - пол дня работы, ну пара дней, если вот прям все типы надо обрабатывать (хотя я бы всё свёл к варчару и блобу). -- Best regards, Sergeymailto:gebele...@gmail.com
Re: Вопрос по встроенной функции HASH()
04.10.2011 18:51, Roman Yaroshenko пишет: Вот такой вот запрос: == SELECT ... GROUP BY 1 Выдаст наличие совпадений по значению хеша, хотя строки все отличаются. Я понимаю, что вероятность совпадения значений хеша при разных входных данных допускается, но не такая же большая. Какой алгоритм для получения хеша используется и есть ли возможность выбирать алгоритмы, - ну например: разные алгоритмы - разные названия функций, или все-таки UDF нам поможет? :) Ну есть два варианта: 1. Добей пробелами до определенной длины. 2. Забей на хеши - справочник медикаментов не настолько большой чтобы дать реальное ускорение с использованием хеша. Сам юзаю MD5, но он имеет смысл только в синтаксическом разборе, а не в прямом поиске. А прямой поиск тупо делается на индексах по строкам. Даже при моих объемах тормозов особенных не замечено (а объемы поболее чем даже аптечная сеть :-) ) -- Андрей Кручинин www.med-zakaz.ru Для особо извращенных - http://мед-заказ.рф :-)
Re: Вопрос по встроенной функции HASH()
05.10.2011 6:28, Андрей Кручинин пишет: Выдаст наличие совпадений по значению хеша, хотя строки все отличаются. Я понимаю, что вероятность совпадения значений хеша при разных входных данных допускается, но не такая же большая. Ну есть два варианта: 1. Добей пробелами до определенной длины. 2. Забей на хеши - справочник медикаментов не настолько большой чтобы дать реальное ускорение с использованием хеша. Сам юзаю MD5, но он имеет смысл только в синтаксическом разборе, а не в прямом поиске. А прямой поиск тупо делается на индексах по строкам. Даже при моих объемах тормозов особенных не замечено (а объемы поболее чем даже аптечная сеть :-) ) Наши объемы - это все зарегистрированные лек. средства Украины. :) В наших проектах уже давно используем SHA1, - совпадений пока не замечал. Просто с появлением встроенной функции HASH решили ее попробовать, но в результате получилось хуже. Все-таки будем использовать классический поиск и группировку по индексам на значения строк, а не по хешу. -- Роман Ярошенко http://www.morion.ua
Re: Вопрос по встроенной функции HASH()
04.10.2011 18:46, Sergey Mereutsa пишет: Там (насколько я помню) простой CRC48 или что-то похожее. Совпадения достаточно часто встречаются, если строки отличаются чётным количеством байт (по крайней мере у меня было именно так). Лучше всего использовать SHA1/MD5, благо все есть в исходниках и сделать UDF из них в простом случае - пол дня работы, ну пара дней, если вот прям все типы надо обрабатывать (хотя я бы всё свёл к варчару и блобу). Сами уже давно юзаем SHA1 через UDF, - вот решили попробовать встр. функцию HASH... В общем не будем больше пихать хеш во все дыры. :)