Loc*_*ock 7 sql sql-server hash key sql-server-2012
是否存在生成数字作为输出的散列函数之类的东西?
基本上 - 我需要在我的 SQL Server 中创建一个关键列,它是确定性的(结果是可重复的)并且基于数据库中的 3 列。此列将用作将进入远程系统的那条数据的键(我将使用此键来匹配在外部系统中创建的数据备份)。
对于类似的事情,我一直在使用 SHA5 散列算法来创建我的密钥,但是我目前正在处理的数据必须是数字。
有任何想法吗?结果必须是可重复的,因此必须基于输入列。
SQL Server 有几个用于计算各种散列的内置函数。
不清楚您所说的“我目前正在处理的数据必须是数字数据”是什么意思。可以根据任何类型的源数据计算散列,散列函数的结果(位数)取决于所选的散列函数。
从技术上讲,您可以将您的密钥定义为binary(n)您喜欢的任何字节数。4 和 8 字节(int和bigint)只是特殊情况。
这是我所知道的 SQL Server 哈希函数列表。
BINARY_CHECKSUM,返回int。返回对表的一行或表达式列表计算的二进制校验和值。
它可能是您使用的最简单的函数,因为您可以轻松指定要包含在计算中的列:
SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
Run Code Online (Sandbox Code Playgroud)
这个函数的缺点是:它返回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 BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
Run Code Online (Sandbox Code Playgroud)