gpt4 book ai didi

tsql - 为什么 CHECKSUM_AGG() 为完全不同的输入值返回相同的值?

转载 作者:行者123 更新时间:2023-12-04 20:40:57 25 4
gpt4 key购买 nike

我真的不明白 CHECKSUM_AGG()有效,尽管我知道它是通过使用 XOR 以某种方式构建的。这解释了为什么它返回 0当你传递相等的整数时。

但是为什么我在以下 SQL 中得到相同的聚合校验和,其中输入值是唯一的?

DECLARE @test1 TABLE (chksum INT)
INSERT INTO @test1 VALUES (2147473855), (2147473343)
SELECT CHECKSUM_AGG(chksum)
FROM @test1

DECLARE @test2 TABLE (chksum INT)
INSERT INTO @test2 VALUES (2147474831), (2147472271)
SELECT CHECKSUM_AGG(chksum)
FROM @test2

一个解释将不胜感激。谢谢!

最佳答案

SQL Server CHECKSUM 和 CHECKSUM_AGG 实现存在已知问题:CHECKSUM weakness explained

改用哈希字节:Using HASHBYTES to compare columns

来自 Microsoft :
如果表达式列表中的值之一发生变化,则列表的校验和通常也会发生变化。然而,校验和不变的可能性很小 .出于这个原因,我们不建议使用 CHECKSUM 来检测值是否已更改,除非您的应用程序可以容忍偶尔丢失更改。 考虑使用 HashBytes 代替 .当指定 MD5 哈希算法时,HashBytes 对于两个不同的输入返回相同结果的概率远低于 CHECKSUM。

您不能直接跨行使用 HASHBYTES - 有一种解决方法 here .

这是使用 HASBYTES 解决方法对较小数字的比较:

DECLARE @test1 TABLE (chksum INT) 
DECLARE @test2 TABLE (chksum INT)

INSERT INTO @test1 VALUES (50), (3), (26)
INSERT INTO @test2 VALUES (45), (0), (6)

SELECT [Values] = '50, 3, 26',
[Checksum] = CHECKSUM_AGG(chksum),
-- HashBytes is limited to 8000 bytes only
[Hashbytes] = HashBytes('md5',convert(varbinary(max),(SELECT * FROM @test1 FOR XML AUTO)))
FROM @test1

UNION ALL
SELECT [Values] = '45, 0, 6',
[Checksum] = CHECKSUM_AGG(chksum),
-- HashBytes is limited to 8000 bytes only
[Hashbytes] = HashBytes('md5',convert(varbinary(max),(SELECT * FROM @test2 FOR XML AUTO)))
FROM @test2

CHECKSUM_AGG vs HASHBYTES

关于tsql - 为什么 CHECKSUM_AGG() 为完全不同的输入值返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com