SQL Server的散列函数HASHBYTES
的输入限制为8000字节。
如何散列较大的字符串?
答案 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元素。