Visual C++ 7.1Visual Studio 6Visual C++ 7.0DBAVisual Studio .NET 2003Windows 2003.NET 1.1Windows 2000Visual C++ 6.0Windows XP中级开发Visual StudioSQL ServerSQLWindowsC++.NET
MD5 哈希 SQL Server 扩展存储过程






4.93/5 (89投票s)
2004年1月27日
2分钟阅读

915947

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 上编译和测试。
安装
- 提取或构建 DLL 文件 xp_md5.dll 并将其放置在 C:\Program Files\Microsoft SQL Server\MSSQL\Binn(或适当的位置)。预编译的 DLL 在源分发的 Release 目录中。
- 在 "master" 数据库中创建一个名为
xp_md5
的扩展存储过程。 右键单击服务器管理器中 master 数据库下的“扩展存储过程”,然后单击“新建扩展存储过程...”。 在“名称”中输入 xp_md5,在“路径”中输入 xp_md5.dll 的完整路径。注意:如果您想手动添加它
USE master; EXEC sp_addextendedproc 'xp_md5', 'xp_md5.dll'
- 为您计划使用 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
- (可选) 创建其他用户定义函数,以便您可以指定数据长度(用于子字符串、
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,我建议您重新编译它,而不要使用该链接器选项。
干杯。