Голосование TSQL CHECKSUM

SELECT BINARY_CHECKSUM('Clifton House, Thornaby Place, Teesdale South, Stockton-On-Tees, Cleveland, TS17 6SD')
SELECT BINARY_CHECKSUM('Clifton House, Teesdale South, Thornaby Place, Stockton-On-Tees, Cleveland, TS17 6SD')

SELECT BINARY_CHECKSUM('Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9DZ')
SELECT BINARY_CHECKSUM('Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9EJ')

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

Интересно, что эти пары значений демонстрируют совершенно противоположное. Они генерируют равные контрольные суммы для очень близких значений данных. На самом деле это единственные повторяющиеся значения контрольной суммы в довольно большой таблице адресов (680 000 записей).

Я немного обеспокоен тем, что неправильно понял значение контрольной суммы при создании UPDATE? Должен ли я прибегать к полем грубой силы путем сопоставления полей, чтобы быть абсолютно уверенным в сборе изменения в строке данных?

Исходные данные для этих примеров были в 6 отдельных столбцах. Для ясности я уменьшил образец кода до минимального состояния.

Ответ 1

Контрольные суммы никогда не являются полностью надежными. Для полностью-всегда-правильного-без-материи-что-то-то-то и есть грубая сила. Есть некоторые менее интенсивные методы, которые могут работать.

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

например:

SELECT HASHBYTES('MD5', 'Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9DZ')

Ответ 2

попробуйте использовать HASHBYTES() с MD5 или SHA1 вместо BINARY_CHECKSUM. прочитайте справку для HASHBYTES() сначала...

Ответ 3

Возможно, вы сможете использовать хеш-байты:

SELECT HASHBYTES('MD5', 'Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9DZ')

SELECT HASHBYTES('MD5', 'Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9EJ')