Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Checksum vs binary_checksum vs hashbytes  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Задача: получить по набору строковых полей хеш и поместить его в поле типа bigint с минимальным количеством коллизий (одинаковых хеш-кодов для разных ключей).
Будем считать, что все входные данные в 1ом регистре.
checksum наверное сразу отпадает, так как он полностью игнорит символ '-', т.е. выдает одинаковый хеш для '--a--' и 'a',
так же checksum('6978.152.114.024.021.04ф') = checksum('6978.152.115.024.021.07ф'), причем равенство выполняется для любого другого символа в конце указанной строки(вместо 'ф').

Вообще возможно кто-то уже вывел список недостатков checksum'a, если да, то где?

Что лучше: binary_checksum или hashbytes (например с функцией 'MD5') с учетом того,
что значение потом придется конвертить в bigint?

Или для данной задачи лучше реализовать собственную функцию?

print @@version

+

       Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) 
	Aug 19 2014 12:21:34 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 10586: )

4 июл 16, 13:31    [19366687]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37059
Ни один из алгоритмов hashbytes не выдает 64-битный хеш. Минимум 16 байт.
4 июл 16, 13:33    [19366703]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
А что возвращает binary_checksum, что-то не могу найти в БОЛе.
По виду int, а может bigint?
4 июл 16, 16:55    [19367784]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37059
declare
    @out    sql_variant = binary_checksum('Test')

select @out, sql_variant_property(@out, 'BaseType')


Пишет int.
4 июл 16, 17:00    [19367803]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 554
Шамиль Фаридович,

Про binary_checksum у MS - пишет что по сути функции похожи, различия в трактовке строковых полей и case sensitive (в противоположность CHECKSUM - который not case sensitive). Так что если у вас претензии к CHECKSUM не ограничиваются неучетом регистра - лучше будет выбрать HASHBYTES.
5 июл 16, 12:37    [19370366]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Ferdipux,

там вообще надо самопальную функцию писать, т.к. под условие задачи ничто другое не подходит.
5 июл 16, 13:51    [19370901]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 554
Владислав Колосов
там вообще надо самопальную функцию писать, т.к. под условие задачи ничто другое не подходит.

Да, вы правы, увидел bigint. Вопрос к топикстартеру - зачем это нужно, т.к. хеши на 8 байт как-то вышли из моды по определенным соображениям...
5 июл 16, 15:25    [19371414]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Ferdipux
MS - пишет что по сути функции похожи, различия в трактовке строковых полей и case sensitive

Похожи, но для указанных выше примеров binary_checksum выдает разные хеш-коды.

Ferdipux
увидел bigint. Вопрос к топикстартеру - зачем это нужно

Есть таблица-справочник с Id типа bigint и еще 4 полями.
В большинстве использующих этот справочник таблиц эти 4 поля и так содержатся, но в некоторых их все-таки нет.
Справочник получился довольно бестолковый, так как очень сильно разросся, и поиск по нему тормозил процесс вставки записей в зависимые таблицы.
Было принято решение избавится от него, а в таблицах с недостаточным набором данных вместо ссылки на справочник записывать хеш-код набора 4 полей, который был также добавлен в одну из зависимых таблиц с полным набором данных - т.е. теперь она выступает в качестве справочника.
В общем была произведена некая денормализация БД.
Думаю нужно будет добавить в таблицы с недостаточным набором данных кроме хеш-кода еще одно поле - для доп. проверки.
6 июл 16, 11:25    [19374331]     Ответить | Цитировать Сообщить модератору
 Re: Checksum vs binary_checksum vs hashbytes  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Шамиль Фаридович,

на самом деле Вы усугубите ситуацию. Вам нужно произвести разделение таблиц и отделить справочник в отдельную сущность, а вместо таблиц с отделённым справочником подставить в запросы представления (имена можно сохранить как у таблиц, а таблицы без справочных столбцов переименовать).
Парадигма реляционных баз как раз заключается в минимизации хранения повторяющейся информации, и не в умножении сущностей.
6 июл 16, 18:12    [19377180]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить