SQL Server 中的数字散列函数?

Loc*_*ock 7 sql sql-server hash key sql-server-2012

是否存在生成数字作为输出的散列函数之类的东西?

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

对于类似的事情,我一直在使用 SHA5 散列算法来创建我的密钥,但是我目前正在处理的数据必须是数字。

有任何想法吗?结果必须是可重复的,因此必须基于输入列。

Vla*_*nov 8

SQL Server 有几个用于计算各种散列的内置函数。

不清楚您所说的“我目前正在处理的数据必须是数字数据”是什么意思。可以根据任何类型的源数据计算散列,散列函数的结果(位数)取决于所选的散列函数。

从技术上讲,您可以将您的密钥定义为binary(n)您喜欢的任何字节数。4 和 8 字节(intbigint)只是特殊情况。


这是我所知道的 SQL Server 哈希函数列表。

  1. BINARY_CHECKSUM,返回int

返回对表的一行或表达式列表计算的二进制校验和值。

它可能是您使用的最简单的函数,因为您可以轻松指定要包含在计算中的列:

SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
Run Code Online (Sandbox Code Playgroud)

这个函数的缺点是:它返回int,这可能会导致碰撞的几率很高。我们真的不知道它实现了什么算法,这个算法在不同版本的 SQL Server 中可能会有所不同。如果您的远程系统也需要计算散列,那么您必须使用一些众所周知的标准函数,见HASHBYTES下文。

  1. CHECKSUM,非常相似BINARY_CHECKSUM。我在文档中看到的主要区别是CHECKSUM遵守排序规则,例如区分大小写,同时BINARY_CHECKSUM始终使用列的二进制值。

例如,字符串“McCavity”和“Mccavity”具有不同的 BINARY_CHECKSUM 值。相反,对于不区分大小写的服务器,CHECKSUM 为这些字符串返回相同的校验和值。您应该避免将 CHECKSUM 值与 BINARY_CHECKSUM 值进行比较。

  1. HASHBYTES. 实现给定的散列算法 (MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512)。返回varbinary
SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
Run Code Online (Sandbox Code Playgroud)