是否有一种哈希函数能够产生数字作为它的输出?
基本上,我需要在我的SQL Server中创建一个键列,该列是确定性(结果可重复)的,并基于数据库中的3列。该列将用作该数据片段的关键字,该数据片段将进入远程系统(我将使用此键来匹配在外部系统中创建该数据时的数据)。
对于类似的事情,我一直在使用SHA5哈希算法创建我的键,但是我现在处理的数据必须是数字。
有什么想法吗?结果必须可重复,因此必须基于输入列。
是否有一种哈希函数能够产生数字作为它的输出?
基本上,我需要在我的SQL Server中创建一个键列,该列是确定性(结果可重复)的,并基于数据库中的3列。该列将用作该数据片段的关键字,该数据片段将进入远程系统(我将使用此键来匹配在外部系统中创建该数据时的数据)。
对于类似的事情,我一直在使用SHA5哈希算法创建我的键,但是我现在处理的数据必须是数字。
有什么想法吗?结果必须可重复,因此必须基于输入列。
SQL Server内置了多个用于计算各种哈希值的函数。
“我正在处理的数据必须是数字”的意思不太清楚。哈希可以根据任何类型的源数据进行计算,哈希函数的结果(位数)取决于所选择的哈希函数。
从技术上讲,您可以将密钥定义为binary(n)
,其中n是您感到舒适的字节数。4和8字节(int
和bigint
)只是特殊情况。
以下是我知道的SQL Server哈希函数列表。
BINARY_CHECKSUM
,返回int
。返回在表格行或表达式列表上计算得出的二进制检验和值。
这可能是你最容易使用的函数,因为你可以轻松地指定要包含在计算中的列:
SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
该函数的缺点是: 它返回一个整数类型的值,这可能会导致高碰撞率。我们不知道它实现的算法,并且这个算法在不同版本的SQL Server中可能是不同的。如果您的远程系统也需要计算哈希值,那么您必须使用一些广为人知的标准函数,参见下面的HASHBYTES
。CHECKSUM
,与BINARY_CHECKSUM
非常相似。我在文档中看到的主要区别是CHECKSUM
遵守排序规则,例如大小写敏感性,而BINARY_CHECKSUM
始终使用列的二进制值。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;
您可以使用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。
只需用您正在使用的数字字段替换数字即可。