Каковы различия между КОНТРОЛЬНОЙ СУММОЙ () и BINARY_CHECKSUM () и когда/какой соответствующие сценарии использования?

Я не квалифицирован для ответа на это в общем смысле, но ограничен программированием? Не очень.

, Почему? Я думал об этом некоторое время, и я думаю, что мы испытываем недостаток в двух вещах: смысл истории и способа объективно судить все мы произвели. Это не верно во всех случаях, но находится в генерале.

Для истории, я думаю, что это - просто что-то не подчеркнутое достаточно в популярной записи или программах информатики. Возьмите функции языка, например. Канонический источник мог бы быть HOPL, но это - определенно не общепринятая истина среди программистов, чтобы быть в состоянии отметить момент времени или в котором языке сначала появилась функция как GC или закрытия. И конечно после этого существует знание прогрессии со временем: как ООП изменилось начиная с Simula? Сравните и контрастируйте наш смысл истории с тем из других полей как, возможно, политология или философия.

Что касается решения, это - действительно отказ с нашей стороны для поиска объективных мер успеха. Данный foobar, в том, какой измеримый путь это улучшило некоторый аспект в процессе программирования, где foobar является каким-либо из шаблонов разработки, гибкой методологии, TDD, и т.д. и т.д., мы даже попытались измерить это? Что мы даже хотим измерить? Правильность, производительность программиста, кодирует четкость и т.д.? Как? Разработка программного обеспечения должна действительно выбирать далеко в этих вопросах, но я должен все же видеть его.

19
задан Andrew Burns 6 August 2009 в 17:51
поделиться

3 ответа

Прочтите следующее сообщение в блоге, в котором освещаются различия.

http: //decipherinfosys.wordpress.com/2007/05/18/checksum-functions-in-sql-server-2005/

Добавление информации по этой ссылке:

Ключевое предназначение функций CHECKSUM - построить хэш индекс на основе выражения или списка столбцов. Если, скажем, вы используете его для вычисления и хранения столбца на уровне таблицы, чтобы обозначить контрольную сумму по столбцам, которые делают запись уникальной в таблице, то это может быть полезно при определении того, изменилась ли строка или нет. Затем этот механизм можно использовать вместо объединения со всеми столбцами, которые делают запись уникальной, чтобы увидеть, была ли обновлена ​​запись или нет. В электронной документации по SQL Server есть множество примеров по этой функциональности.

При использовании этих функций следует учитывать несколько моментов:

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

Мы не рекомендуем использовать контрольную сумму (*), поскольку значение, которое будет сгенерировано таким образом, будет основано на порядке столбцов определение таблицы во время выполнения, которое может легко измениться с течением времени. Итак, явно определите список столбцов.

Будьте осторожны при включении столбцов типа данных datetime, поскольку степень детализации составляет 1/300 секунды, и даже небольшое изменение приведет к другому значению контрольной суммы. Итак, если вам нужно использовать столбец типа данных datetime, затем убедитесь, что вы получили точную дату + час / мин. т.е. желаемый уровень детализации.

Вам доступны три функции контрольной суммы:

CHECKSUM: Это было описано выше.

CHECKSUM_AGG: Возвращает контрольную сумму значений в группе, а значения NULL - в этом случае игнорируется. Это также работает с предложением OVER новой аналитической функции в SQL Server 2005.

BINARY_CHECKSUM: Как указано в имени, это возвращает двоичное значение контрольной суммы, вычисленное для строки или списка выражений. Разница между CHECKSUM и BINARY_CHECKSUM заключается в значении, созданном для строковых типов данных. Другое отличие заключается в сравнении выражений. BINARY_CHECKSUM () возвращает одно и то же значение, если элементы двух выражений имеют одинаковый тип и байтовое представление. Итак, «2Volvo Director 20» и «3Volvo Director 30» дадут одно и то же значение, однако функция CHECKSUM () оценивает тип, а также сравнивает две строки, и если они равны, то возвращается только одно и то же значение.

Example:
STRING              BINARY_CHECKSUM_USAGE    CHECKSUM_USAGE
------------------- ----------------------    -----------
2Volvo Director 20  -1356512636                -341465450
3Volvo Director 30  -1356512636                -341453853
4Volvo Director 40  -1356512636                -341455363
17
ответ дан 30 November 2019 в 03:43
поделиться

Легко получить коллизии из CHECKSUM (). HASHBYTES () был добавлен в SQL 2005 для улучшения хэш-функций системы SQL Server, поэтому я предлагаю вам также изучить его как альтернативу.

2
ответ дан 30 November 2019 в 03:43
поделиться

Я обнаружил, что конфликты контрольных сумм (т. Е. Два разных значения, возвращающих одну и ту же контрольную сумму) встречаются чаще, чем кажется большинству людей. У нас есть таблица валют, в которой в качестве PK используется код валюты ISO. А в таблице, содержащей менее 200 строк, есть три пары кодов валют, которые возвращают одну и ту же Binary_Checksum ():

  • «ETB» и «EUR» (эфиопский быр и евро) возвращают 16386.
  • «LTL» »и« MDL »(литовские литы и молдавские лей) возвращают 18700.
  • « TJS »и« UZS »(сомони и узбекские сомы) возвращают 20723.

То же самое происходит с кодами культуры ISO:« de » и «eu» (немецкий и баскский) оба возвращают 1573.

Изменение Binary_Checksum () на Checksum () устраняет проблему в этих случаях ... но в других случаях это может не помочь. Поэтому я советую тщательно протестировать, прежде чем слишком полагаться на уникальность этих функций.

5
ответ дан 30 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: