我在SQL Server 2014中有一个表,其中包含以下列:
ID (PK, int, not null)
filecontent (varbinary(max), not null)
filecontenthashed (computed, binay(16), null) => ([sys].[fn_repl_hash_binary](filecontent))
我在此表中将文件存储为bytes[]
,并使用散列列检查重复项。
运行select语句,它返回计算列。
但是当我插入相同的文件3次(完全相同的文件)时,我注意到计算列返回了不同的散列值。
FileContent FileContentHashed
0x255044462D312E350A25C7EC8FA20A35203... 0x71E2322C77CAFFCDF3E427D7BF6537E3
0x255044462D312E350A25C7EC8FA20A35203... 0x16E142FEAA996B38413B87023A651E28
0x255044462D312E350A25C7EC8FA20A35203... 0x1F02D564F0A550C9FAF913A023B6C2EA
为什么它没有返回相同的值有任何想法或建议?
我将此函数用于计算列
([sys].[fn_repl_hash_binary](filecontent))
另外,我的文件大于8000字节
答案 0 :(得分:1)
HASHBYTES
功能以下是您的表定义示例。
ID (PK, int, not null)
filecontent (varbinary(max), not null)
filecontenthashed (computed, binay(16), null) => (HASHBYTES('MD5', filecontent))
您可以使用以下算法:
MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
文档说输入可以使用varbinary
@input指定包含要散列的数据的变量。 @input 是varchar,nvarchar或varbinary。
另外,我建议您使用PERSISTED
计算列来解决演出问题。
顺便说一句,请确保您在SQL 2016或更高版本上进行迁移,以使此解决方案正常工作 (如果您的数据输入超过8KB)
对于SQL Server 2014及更早版本,允许的输入值仅限于 8000字节。
如果在SQL 2016上迁移是个问题,您可以考虑使用CHECKSUM
function。