有没有产生数字作为输出的散列函数之类的东西?
基本上 - 我需要在我的 SQL Server 中创建一个关键列,它是确定性的(结果是可重复的)并且基于数据库中的 3 列。此列将用作将进入远程系统的那条数据的键(我将使用此键来匹配在外部系统中创建的数据备份)。
对于类似的事情,我一直在使用 SHA5 哈希算法来创建我的 key ,但是我目前正在处理的数据必须是数字。
有任何想法吗?
结果必须是可重复的,因此必须基于输入列。
最佳答案
SQL Server 有几个用于计算各种散列的内置函数。
不清楚您所说的“我目前正在处理的数据必须是数字数据”是什么意思。可以根据任何类型的源数据计算散列,散列函数的结果(位数)取决于所选的散列函数。
从技术上讲,您可以将 key 定义为 binary(n)
使用您喜欢的任何字节数。 4 和 8 字节( int
和 bigint
)只是特殊情况。
这是我所知道的 SQL Server 哈希函数列表。
BINARY_CHECKSUM
, 返回 int
. Returns the binary checksum value computed over a row of a table or over a list of expressions.
它可能是您使用的最简单的函数,因为您可以轻松指定要包含在计算中的列:
SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
该函数的缺点是:它返回
int
,这可能会导致碰撞的可能性很高。我们真的不知道它实现了什么算法,这个算法在不同版本的 SQL Server 中可能会有所不同。如果您的远程系统也需要计算散列,那么您必须使用一些众所周知的标准函数,参见 HASHBYTES
以下。CHECKSUM
,非常类似于 BINARY_CHECKSUM
.我在文档中看到的主要区别是 CHECKSUM
遵守排序规则,例如区分大小写,而 BINARY_CHECKSUM
始终使用列的二进制值。 For example, the strings "McCavity" and "Mccavity" have different BINARY_CHECKSUM values. In contrast, for a case-insensitive server, CHECKSUM returns the same checksum values for those strings. You should avoid comparison of CHECKSUM values with BINARY_CHECKSUM values.
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;
关于sql - SQL Server 中的数字散列函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22674510/