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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (7投票s)

2011 年 1 月 7 日

CPOL

2分钟阅读

viewsIcon

29567

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

引言

在 C# 或 VB.NET 等语言中创建 MD5 散列函数非常简单。但在某些情况下,需要在 SQL Server 上实现 MD5 散列算法。不幸的是,SQL Server 没有像 MD5 这样的散列函数,而且编写 T-SQL 脚本也不是一个好主意。这种脚本的性能会非常低。

Using the Code

解决此问题的一种方法是创建一个 .NET 程序集并将其附加到 SQL Server 实例。好的,让我们逐步进行。

  1. 在 Visual Studio 中创建一个新项目。选择类库模板,输入项目名称,然后单击“确定”。
  2. 编写实现 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 参数返回。

    构建我们的项目。

  3. 现在我们应该在 SQL Server 侧创建一个存储过程。为了在 T-SQL 中使用程序集,我们必须在 SQL Server 数据库中创建程序集对象。以下示例显示了如何执行此操作:
  4. 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 日:初始发布
© . All rights reserved.