sql - SQL Server 中的数字散列函数?

标签 sql sql-server hash sql-server-2012 key

有没有产生数字作为输出的散列函数之类的东西?

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

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

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

最佳答案

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

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

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

这是我所知道的 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/

    相关文章:

    mysql - sql查询中返回空值而不是空集

    python - 如何改进这个多对多 Django ORM 查询和模型集?

    sql-server - 使用 LIKE 和 EXISTS 子句时优化数据库架构/索引以获得更快的查询结果

    mysql - 读取xml文件并通过MERGE将值放入sql表中

    sql-server - 为什么 T-SQL EXEC 不返回小数?

    ruby - 使用数字范围选择数组项

    c++ - 快速跨平台 C/C++ 散列库

    mysql - 无法使用sequelize运行连接查询

    sql - FRM-40735 : When button pressed trigger raised unhandled exception ORA-06502

    ruby - 试图理解为什么它不能 "convert string to integer"(Ruby 直方图迭代哈希)