Sql散列varbinary产生不同的结果

时间:2017-05-01 23:43:53

标签: sql-server hash sql-server-2014

我在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字节

1 个答案:

答案 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版本限制和规避

顺便说一句,请确保您在SQL 2016或更高版本上进行迁移,以使此解决方案正常工作 (如果您的数据输入超过8KB)

  

对于SQL Server 2014及更早版本,允许的输入值仅限于   8000字节。

如果在SQL 2016上迁移是个问题,您可以考虑使用CHECKSUM function

参考

HASHBYTES
COMPUTED COLUMN