SQL Server 和 .NET 的一致性哈希函数





5.00/5 (1投票)
提供了一些哈希函数(字符串到整数),在 C# 和 T-SQL 中将返回相同的值。
有时,您需要在 T-SQL 服务器端进行一些哈希运算,并在 C# 中使用,反之亦然。原生 'checksum' 使用的算法并未公开。这里有一个简单的字符串到 32 位哈希函数,可以用来从字符串获取一个数字。如果想将结果缩减到较短的数字,可以使用一个可选参数。这两个函数返回相同的结果。T-SQL 函数源代码
CREATE FUNCTION FnMD5Hash(@SourceString varchar(8000), @Modulo INT = 0)
RETURNS INTEGER
AS
BEGIN
IF @Modulo = 0
RETURN CAST(HashBytes( 'MD5', @SourceString) AS INTEGER)
ELSE
RETURN ABS(CAST(HashBytes( 'MD5', @SourceString) AS INTEGER)) % @Modulo
RETURN 0
END
C# 函数源代码static System.Security.Cryptography.MD5CryptoServiceProvider md5Provider =
new System.Security.Cryptography.MD5CryptoServiceProvider();
// the database is usually set to Latin1_General_CI_AS which is codepage 1252
static System.Text.Encoding encoding =
System.Text.Encoding.GetEncoding(1252);
static Int32 SQLStringToHash(string sourceString, int modulo = 0)
{
var md5Bytes = md5Provider.ComputeHash(encoding.GetBytes(sourceString));
var result = BitConverter.ToInt32(new byte[] {
md5Bytes[15], md5Bytes[14], md5Bytes[13], md5Bytes[12] }, 0);
if (modulo == 0) return result;
else return Math.Abs(result) % modulo;
}
T-SQL 测试源代码DECLARE @SourceString AS VARCHAR(255) = 'Joyeux Noël'
PRINT 'T-SQL Test'
PRINT 'Source: ' + @SourceString
PRINT 'Hash:'
PRINT dbo.FnMD5Hash(@SourceString, default)
PRINT 'Hash (0..999):'
PRINT dbo.FnMD5Hash(@SourceString, 1000)
C# 测试源代码string sourceString = "Joyeux Noël";
Console.WriteLine("C# Test");
Console.WriteLine("Source: "+sourceString);
Console.WriteLine("Hash: " + SQLStringToHash(sourceString));
Console.WriteLine("Hash (0..999): " + SQLStringToHash(sourceString, 1000));
T-SQL 测试输出T-SQL Test Source: Joyeux Noël Hash: -92694766 Hash (0..999): 766C# 测试输出
C# Test Source: Joyeux Noël Hash: -92694766 Hash (0..999): 766