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

MD5 哈希 SQL Server 扩展存储过程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (89投票s)

2004年1月27日

2分钟阅读

viewsIcon

915947

downloadIcon

11377

一个为 SQL Server 实现优化的 MD5 哈希算法的扩展存储过程。很小的 DLL (仅 7 KB)。

引言

这是一个用于 Microsoft SQL Server 2000 的扩展存储过程,它实现了一个优化的 MD5 哈希算法。它的作用类似于 MySQL 的 MD5() 函数。该算法来自 这里。 我只添加了 md5_string() 函数。DLL 应该也适用于旧版本的 SQL Server,尽管我尚未对此进行测试。 该源代码在 Microsoft Visual C++ 6.0 和 .NET 2003 上编译和测试。

安装

  1. 提取或构建 DLL 文件 xp_md5.dll 并将其放置在 C:\Program Files\Microsoft SQL Server\MSSQL\Binn(或适当的位置)。预编译的 DLL 在源分发的 Release 目录中。
  2. 在 "master" 数据库中创建一个名为 xp_md5 的扩展存储过程。 右键单击服务器管理器中 master 数据库下的“扩展存储过程”,然后单击“新建扩展存储过程...”。 在“名称”中输入 xp_md5,在“路径”中输入 xp_md5.dll 的完整路径。

    注意:如果您想手动添加它

    USE master;
    EXEC sp_addextendedproc 'xp_md5', 'xp_md5.dll'
  3. 为您计划使用 MD5 过程的每个数据库创建一个用户定义函数。右键单击相应数据库下的“用户定义函数”,然后单击“新建用户定义函数...”。输入以下内容
    CREATE FUNCTION [dbo].[fn_md5] (@data TEXT) 
    RETURNS CHAR(32) AS
    BEGIN
      DECLARE @hash CHAR(32)
      EXEC master.dbo.xp_md5 @data, -1, @hash OUTPUT
      RETURN @hash
    END
  4. (可选) 创建其他用户定义函数,以便您可以指定数据长度(用于子字符串、BINARY 和其他固定宽度类型)。在这个特定的函数中,我们接受一个 IMAGE 作为输入和一个可选的 LENGTH。负的 LENGTH 值会导致 DLL 尝试自动计算输入长度(这是默认值)
    CREATE FUNCTION [dbo].[fn_md5x] (@data IMAGE, @len INT = -1) 
    RETURNS CHAR(32) AS
    BEGIN
      DECLARE @hash CHAR(32)
      EXEC master.dbo.xp_md5 @data, @len, @hash OUTPUT
      RETURN @hash
    END

用法

FN_MD5

用户定义函数的使用方法如下

-- Sample SQL statement:
-- fn_md5() tries to automatically calculate the length of the input string
SELECT dbo.fn_md5('Hello world!');

-- fn_md5x() takes an optional length arg for substrings, fixed-width types, etc.
SELECT dbo.fn_md5x('Hello world!', 12);

两种语句的输出

86fb269d190d2c85f6e0468ceca42a20

XP_MD5: EXEC xp_md5 <@data> [@length = -1] [@hash OUTPUT]

直接使用扩展存储过程

-- Sample command:
EXEC master.dbo.xp_md5 'Hello world!'

输出

86fb269d190d2c85f6e0468ceca42a20

或者如果您希望将结果保存到变量中

DECLARE @hash CHAR(32)
EXEC master.dbo.xp_md5 'Hello world!', -1, @hash OUTPUT
PRINT @hash

输出

86fb269d190d2c85f6e0468ceca42a20

示例

-- These are just examples for use with the given functions above.
-- Feel free to create your own functions that take the input type you want.
-- Use CAST() with caution, as it may truncate and have other unintended consequences.

-- For TEXT, NTEXT, VARCHAR:
SELECT dbo.fn_md5(data) FROM table;

-- For VARBINARY:
SELECT dbo.fn_md5(CAST(data AS VARCHAR(8000))) FROM table;

-- For IMAGE:
SELECT dbo.fn_md5x(data, DEFAULT) FROM table;

-- For CHAR: (we can use LEN() on this fixed-width type to trim the padding)
SELECT dbo.fn_md5x(data, LEN(data)) FROM table;

-- For NCHAR: (we can use LEN() on this fixed-width type to trim the padding)
SELECT dbo.fn_md5x(CAST(data AS CHAR(4000)), LEN(data)) FROM table;

-- For BINARY:
SELECT dbo.fn_md5x(data, 12) FROM table;

-- FOR SQL_VARIANT:
SELECT dbo.fn_md5x(CAST(data AS VARCHAR(8000)), DATALENGTH(data)) FROM table;

杂项

为了速度,我没有包含任何实际的输入数据验证(例如,类型检查、数据长度检查等)。我选择排除这一点是为了最大限度地提高速度,因为我最初编写它是为了用于一次插入数百万行的应用程序。我也知道我总是正确地调用该过程。如果您想使其更强大 - 就像您不知道将传递给函数的数据类型 - 那么我强烈建议您添加这些保护措施。

最后一件事,我添加了链接器选项 /OPT:NOWIN98 以最大限度地减少二进制文件大小。这可能会对非 NT 系统(例如,Win95、Win98 等)造成性能影响。如果您在这样的系统上使用 DLL,我建议您重新编译它,而不要使用该链接器选项。

干杯。

© . All rights reserved.