Голосование 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')