5
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 条记录)地址表中唯一重复的校验和值。

我有点担心我误解了校验和在生成更新时的价值?我是否必须通过场比较求助于蛮力场才能绝对确定在一行数据中发生变化?

这些示例的原始数据位于 6 个单独的列中。为了清楚起见,我已将代码示例减少到最小状态。

4

3 回答 3

3

校验和从来都不是万无一失的。对于一个完全正确的解决方案,蛮力是方法。不过,有一些不太强烈的方法可以奏效。

校验和几乎是一个非常简单的哈希。尝试改用哈希字节。那么你可以使用像md5这样更混乱的算法。

例如:

SELECT HASHBYTES('MD5', 'Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9DZ')
于 2012-10-11T14:06:16.557 回答
1

尝试使用带有 MD5 或 SHA1 的 HASHBYTES() 而不是 BINARY_CHECKSUM。首先阅读 HASHBYTES() 的帮助...

于 2012-10-11T14:08:32.847 回答
0

您也许可以使用哈希字节:

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

SELECT HASHBYTES('MD5', 'Glenfield Hospital, Groby Road, , Leicester, Leicestershire, LE3 9EJ')
于 2012-10-11T14:09:21.327 回答