哈希函数是否会产生数字作为其输出?
基本上 - 我需要在我的SQL Server中创建一个确定性的键列(结果是可重复的),并且基于数据库中的3列。此列将用作进入远程系统的那段数据的密钥(在外部系统中创建数据时,我将使用此密钥匹配数据)。
对于类似的事情,我一直在使用SHA5哈希算法来创建我的密钥,但是我目前处理的数据必须是数字。
有什么想法吗? 结果必须是可重复的,因此必须基于输入列。
答案 0 :(得分:1)
SQL Server具有一些用于计算各种哈希值的内置函数。
“当前我要处理的数据必须是数字”的含义不明确。可以从任何种类的源数据中计算出哈希值,哈希函数的结果(位数)取决于所选的哈希函数。
从技术上讲,您可以将密钥定义为binary(n)
,并使用任意数量的字节。 4和8个字节(int
和bigint
)只是特殊情况。
这是我所知道的SQL Server哈希函数列表。
BINARY_CHECKSUM
,返回int
。返回在表的一行或第二行上计算的二进制校验和值 在一系列表达式上。
这可能是最简单的函数,因为您可以轻松指定要在计算中包括哪些列:
SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
此函数的缺点是:它返回int
,这可能导致发生冲突的可能性很高。我们真的不知道它实现什么算法,并且该算法在不同版本的SQL Server中可能有所不同。如果您的远程系统也需要计算哈希,则必须使用一些众所周知的标准函数,请参见下面的HASHBYTES
。
CHECKSUM
,与BINARY_CHECKSUM
非常相似。我在文档中看到的主要区别是CHECKSUM
遵循排序规则,例如区分大小写,而BINARY_CHECKSUM
始终使用列的二进制值。例如,字符串“ McCavity”和“ Mccavity”具有不同的名称 BINARY_CHECKSUM值。相反,对于不区分大小写的服务器, 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;
答案 1 :(得分: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
只需用您正在使用的数字字段替换数字。