使用 SQL Server 2005 中的程序集创建 md5 哈希码






4.43/5 (7投票s)
使用 SQL Server 2005 中的程序集创建 md5 哈希码
引言
在 C# 或 VB.NET 等语言中创建 MD5 散列函数非常简单。但在某些情况下,需要在 SQL Server 上实现 MD5 散列算法。不幸的是,SQL Server 没有像 MD5 这样的散列函数,而且编写 T-SQL 脚本也不是一个好主意。这种脚本的性能会非常低。
Using the Code
解决此问题的一种方法是创建一个 .NET 程序集并将其附加到 SQL Server 实例。好的,让我们逐步进行。
- 在 Visual Studio 中创建一个新项目。选择类库模板,输入项目名称,然后单击“确定”。
- 编写实现 MD5 散列码的函数。为此,需要在项目中添加程序集“
System.Security.Cryptography
”。下面的代码显示了 MD5 函数。using System.Security.Cryptography; using System.Text; using System.Data; using System.Data.SqlTypes; namespace Md5Hash { public class Md5Class { [Microsoft.SqlServer.Server.SqlProcedure] public static void HashString(SqlString value, out SqlString result) { string str = value.ToString().Trim(); HashAlgorithm mhash = mhash = new MD5CryptoServiceProvider(); byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(str); byte[] bytHash = mhash.ComputeHash(bytValue); mhash.Clear(); StringBuilder sBuilder = new StringBuilder(); // Loop through each byte of the hashed data // and format each one as a hexadecimal string. for (int i = 0; i < bytHash.Length; i++) { sBuilder.Append(bytHash[i].ToString("x2")); } // Return the hexadecimal string. result = sBuilder.ToString(); } } }
如果您想通过 SQL Server 存储过程使用程序集中的方法,则应遵循以下规则:
- 您的方法必须在程序集中的类上实现为
public static
方法。 - 您的方法必须声明为
void
或返回整数值(在我的示例中,我将方法声明为void
)。 - 参数的数量必须与存储过程中的参数数量相同。
- 所有参数必须根据 SQL Server 数据类型声明(请参阅 MSDN 文章 http://msdn.microsoft.com/en-us/library/ms131092(v=SQL.90).aspx)。
让我们回到我们的代码。我们有一个名为“
MD5Hash
”的类。该类只有一个名为“HashString
”的方法,并用属性[Microsoft.SqlServer.Server.SqlProcedure]
标记。通过此属性,我们定义我们的方法将像一个存储过程一样使用。方法“HashString
”接受两个参数:value
–SqlString
数据类型参数,我们需要返回其散列码。result
-SqlString
按引用传递的数据类型参数,存储过程通过OUTPUT
参数返回。
构建我们的项目。
- 您的方法必须在程序集中的类上实现为
- 现在我们应该在 SQL Server 侧创建一个存储过程。为了在 T-SQL 中使用程序集,我们必须在 SQL Server 数据库中创建程序集对象。以下示例显示了如何执行此操作:
create assembly a_md5Hash
from '\\server\SolutionFolder\bin\Debug\MD5Hash.dll'
go
此 SQL 语句基于我们的 .NET 类创建一个 SQL 程序集。下一步是创建一个将使用我们程序集的存储过程:
create procedure dbo.sp_md5Hash (@value nvarchar(20), _
@return nvarchar(max) output) as _
external name a_md5hash.[Md5Hash.Md5Class].HashString
参数作为外部名称 assembly_name.class_name.method_name
指定了 CLR 存储过程引用 .NET Framework 程序集的方法。
class_name
是我们的 .NET 库的命名空间和类名。method_name
是 .NET 库中 MD5 类的方法名称。assembly_name
是我们的 SQL Server 程序集对象的名称。- 好的。我们完成了!让我们尝试通过我们的存储过程获取散列码:
declare @res nvarchar(max) exec dbo.sp_md5Hash 'Hello World!', @res output select @res
好的,我得到了 86fb269d190d2c85f6e0468ceca42a20。祝你好运!
历史
- 2011 年 1 月 7 日:初始发布