【问题标题】:Numeric hashing function in SQL Server?SQL Server 中的数字散列函数?
【发布时间】:2014-05-05 15:40:09
【问题描述】:

有没有像散列函数那样产生数字作为输出的东西?

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

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

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

【问题讨论】:

  • 除非三列的排列适合 8 个字节,否则不会
  • CHECKSUM() 返回一个整数,但我不确定它是否足以满足您的目的。
  • 为什么需要对这三个关键列进行哈希处理?通常,分布式数据库的解决方案是一个代理键(数字或 GUID)和一个或多个对其他自然键列的唯一约束。冲突解决基于这些独特的约束。

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


【解决方案1】:

您可以使用 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

只需将数字替换为您正在使用的数字字段。

【讨论】:

    【解决方案2】:

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

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

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


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

    1. BINARY_CHECKSUM,返回int

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

    这可能是对您来说最简单的函数,因为您可以轻松地指定要在计算中包含哪些列:

    SELECT BINARY_CHECKSUM(Col1, Col2, Col3) FROM MyTable;
    

    这个函数的缺点是:它返回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 
        HASHBYTES('SHA2_512', 
            CAST(Col1 AS varbinary(8000)) + 
            CAST(Col2 AS varbinary(8000)) + 
            CAST(Col3 AS varbinary(8000))) 
    FROM MyTable;
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2011-12-07
      • 2016-09-03
      • 1970-01-01
      相关资源
      最近更新 更多