65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2011 年 10 月 26 日

CPOL
viewsIcon

29155

提供了一些哈希函数(字符串到整数),在 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): 766
C# 测试输出
C# Test
Source: Joyeux Noël
Hash: -92694766
Hash (0..999): 766
© . All rights reserved.