在SQL Server中散列超过8000个字节

时间:2011-10-14 15:54:27

标签: sql-server sql-server-2008 tsql sqlclr

SQL Server的散列函数HASHBYTES的输入限制为8000字节。

如何散列较大的字符串?

3 个答案:

答案 0 :(得分:9)

您可以编写SQL CLR函数:

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBinary BigHashBytes(SqlString algorithm, SqlString data)
{
    var algo = HashAlgorithm.Create(algorithm.Value);

    var bytes = Encoding.UTF8.GetBytes(data.Value);

    return new SqlBinary(algo.ComputeHash(bytes));
}

然后可以在SQL中调用它:

--these return the same value
select HASHBYTES('md5', 'test stuff')
select dbo.BigHashBytes('md5', 'test stuff')

仅当长度超过8k时才需要BigHashBytes

答案 1 :(得分:5)

您可以对输入的8k(或4k或2k)块进行散列,然后将这些散列连接起来或将它们散列为新的散列值。如果您必须创建类似的算法(例如在外部.NET应用程序中)来比较在SQL Server外部创建的哈希值,这可能会变得很困难。

另一种选择:依靠SQL Server的CLR integration并在.NET程序集中执行散列。

答案 2 :(得分:2)

与Paul的想法一样,一个想到分块的想法是将散列字符串存储在XML列中,每个块作为单独的XML元素。