Вопрос по встроенной функции HASH()

2011-10-04 Thread Roman Yaroshenko

Привет, 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()

2011-10-04 Thread A.Truhin
>> 05.10.2011 0:51, Roman Yaroshenko пишет:
Да, FB 2.5.1.26308, если подключение и строки win1251 совпадения есть,
UTF8 нет.



Re: Вопрос по встроенной функции HASH()

2011-10-04 Thread Sergey Mereutsa
Привет!

Там (насколько я помню) простой CRC48 или что-то похожее. Совпадения
достаточно часто встречаются, если строки отличаются чётным
количеством байт (по крайней мере у меня было именно так).
Лучше всего использовать SHA1/MD5, благо все есть в исходниках и
сделать UDF из них в простом случае - пол дня работы, ну пара дней,
если вот прям все типы надо обрабатывать (хотя я бы всё свёл к варчару
и блобу).


-- 
Best regards,
 Sergeymailto:gebele...@gmail.com




Re: Вопрос по встроенной функции HASH()

2011-10-04 Thread Андрей Кручинин

04.10.2011 18:51, Roman Yaroshenko пишет:


Вот такой вот запрос:
==
SELECT
...
GROUP BY 1

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

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


Ну есть два варианта:

1. Добей пробелами до определенной длины.

2. Забей на хеши - справочник медикаментов не настолько большой чтобы 
дать реальное ускорение с использованием хеша. Сам юзаю MD5, но он имеет 
смысл только в синтаксическом разборе, а не в прямом поиске. А прямой 
поиск тупо делается на индексах по строкам. Даже при моих объемах 
тормозов особенных не замечено (а объемы поболее чем даже аптечная сеть 
:-) )


--
Андрей Кручинин
www.med-zakaz.ru
Для особо извращенных - http://мед-заказ.рф :-)



Re: Вопрос по встроенной функции HASH()

2011-10-04 Thread Roman Yaroshenko

05.10.2011 6:28, Андрей Кручинин пишет:

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


Ну есть два варианта:

1. Добей пробелами до определенной длины.

2. Забей на хеши - справочник медикаментов не настолько большой чтобы
дать реальное ускорение с использованием хеша. Сам юзаю MD5, но он имеет
смысл только в синтаксическом разборе, а не в прямом поиске. А прямой
поиск тупо делается на индексах по строкам. Даже при моих объемах
тормозов особенных не замечено (а объемы поболее чем даже аптечная сеть
:-) )


Наши объемы - это все зарегистрированные лек. средства Украины. :)
В наших проектах уже давно используем SHA1, - совпадений пока не 
замечал. Просто с появлением встроенной функции HASH решили ее 
попробовать, но в результате получилось хуже. Все-таки будем 
использовать классический поиск и группировку по индексам на значения 
строк, а не по хешу.


--
Роман Ярошенко
http://www.morion.ua



Re: Вопрос по встроенной функции HASH()

2011-10-04 Thread Roman Yaroshenko

04.10.2011 18:46, Sergey Mereutsa пишет:

Там (насколько я помню) простой CRC48 или что-то похожее. Совпадения
достаточно часто встречаются, если строки отличаются чётным
количеством байт (по крайней мере у меня было именно так).
Лучше всего использовать SHA1/MD5, благо все есть в исходниках и
сделать UDF из них в простом случае - пол дня работы, ну пара дней,
если вот прям все типы надо обрабатывать (хотя я бы всё свёл к варчару
и блобу).

Сами уже давно юзаем SHA1 через UDF, - вот решили попробовать встр. 
функцию HASH...   В общем не будем больше пихать хеш во все дыры. :)