SQL Server中的数字哈希函数?

12

是否有一种哈希函数能够产生数字作为它的输出?

基本上,我需要在我的SQL Server中创建一个键列,该列是确定性(结果可重复)的,并基于数据库中的3列。该列将用作该数据片段的关键字,该数据片段将进入远程系统(我将使用此键来匹配在外部系统中创建该数据时的数据)。

对于类似的事情,我一直在使用SHA5哈希算法创建我的键,但是我现在处理的数据必须是数字。

有什么想法吗?结果必须可重复,因此必须基于输入列。


除非三列的排列适合于8个字节,否则不行。 - Tony Hopkinson
1
CHECKSUM() 返回一个整数,但我不确定它是否足够适合您的目的。 - TomT
为什么需要对这三个关键列进行哈希处理?通常,分布式数据库的解决方案是一个代理键(数字或GUID)和其他自然键列上的一个或多个唯一约束条件。冲突解决基于这些唯一约束条件。 - serge
2个回答

15

SQL Server内置了多个用于计算各种哈希值的函数。

“我正在处理的数据必须是数字”的意思不太清楚。哈希可以根据任何类型的源数据进行计算,哈希函数的结果(位数)取决于所选择的哈希函数。

从技术上讲,您可以将密钥定义为binary(n),其中n是您感到舒适的字节数。4和8字节(intbigint)只是特殊情况。


以下是我知道的SQL Server哈希函数列表。

  1. BINARY_CHECKSUM,返回int

返回在表格行或表达式列表上计算得出的二进制检验和值。

这可能是你最容易使用的函数,因为你可以轻松地指定要包含在计算中的列:

SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
该函数的缺点是: 它返回一个整数类型的值,这可能会导致高碰撞率。我们不知道它实现的算法,并且这个算法在不同版本的SQL Server中可能是不同的。如果您的远程系统也需要计算哈希值,那么您必须使用一些广为人知的标准函数,参见下面的HASHBYTES
2. CHECKSUM,与BINARY_CHECKSUM非常相似。我在文档中看到的主要区别是CHECKSUM遵守排序规则,例如大小写敏感性,而BINARY_CHECKSUM始终使用列的二进制值。
例如,字符串“McCavity”和“Mccavity”的BINARY_CHECKSUM值不同。相反,在不区分大小写的服务器上,CHECKSUM返回这些字符串的相同校验和值。您应该避免将CHECKSUM值与BINARY_CHECKSUM值进行比较。
3. HASHBYTES。实现给定的哈希算法(MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512)。返回varbinary类型的值。
SELECT 
    HASHBYTES('SHA2_512', 
        CAST(Col1 AS varbinary(8000)) + 
        CAST(Col2 AS varbinary(8000)) + 
        CAST(Col3 AS varbinary(8000))) 
FROM MyTable;

0

您可以使用Hasbytes函数将您的值使用Sha算法进行哈希。由于您正在处理数字值,因此您需要将要哈希的值转换为varchar。

例如:如果我要哈希的值是12345,则SQL代码如下:

SELECT HASHBYTES('SHA',CONVERT(VARCHAR(50),12345)) 

这将输出散列值0x8CB2237D0679CA88DB6464EAC60DA96345513964。

如果您想将3个不同的值哈希为一个值,可以像这样操作

SELECT
HASHBYTES('SHA',CONVERT(VARCHAR(50),12345) + CONVERT(VARCHAR(50),6789) + CONVERT(VARCHAR(50),101112))

这将输出哈希值0x66C30E0B60687DBA43CA43F39A2760BC0BEA4DE8。

只需用您正在使用的数字字段替换数字即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接