SQL Server 內建 HASHBYTES('MD5', ...) 從 2005 開始提供,但 2000 版本無此函數。本文展示純 T-SQL 實現 MD5 的第一步:位掩碼查找表函數 MD5_m_OnBits。
返回低 @i 位全為 1 的整數掩碼(0→1, 1→3, 2→7, ..., 31→0xFFFFFFFF),用於 MD5 輪函數中的位運算。
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_OnBits]') AND xtype IN (N'FN',N'IF',N'TF'))
DROP FUNCTION [dbo].[MD5_m_OnBits];
GO
CREATE FUNCTION dbo.MD5_m_OnBits (@i TINYINT)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
DECLARE @iRes INT;
SELECT @iRes = CASE @i
WHEN 0 THEN 1 -- 0x00000001
WHEN 1 THEN 3 -- 0x00000003
WHEN 2 THEN 7 -- 0x00000007
WHEN 3 THEN 15 -- 0x0000000F
WHEN 4 THEN 31 -- 0x0000001F
WHEN 5 THEN 63 -- 0x0000003F
WHEN 6 THEN 127 -- 0x0000007F
WHEN 7 THEN 255 -- 0x000000FF
WHEN 8 THEN 511 -- 0x000001FF
WHEN 9 THEN 1023 -- 0x000003FF
WHEN 10 THEN 2047 -- 0x000007FF
WHEN 11 THEN 4095 -- 0x00000FFF
WHEN 12 THEN 8191 -- 0x00001FFF
WHEN 13 THEN 16383 -- 0x00003FFF
WHEN 14 THEN 32767 -- 0x00007FFF
WHEN 15 THEN 65535 -- 0x0000FFFF
WHEN 16 THEN 131071 -- 0x0001FFFF
WHEN 17 THEN 262143 -- 0x0003FFFF
WHEN 18 THEN 524287 -- 0x0007FFFF
-- ... 續至 31
ELSE 0
END;
RETURN @iRes;
END;
MD5_Hash(@input VARCHAR(MAX)) RETURNS BINARY(16)純 T-SQL 實現 MD5 屬教學/兼容性用途,生產環境 2005+ 請直接用 HASHBYTES 或 CLR。