首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MD5 演算法 T-SQL 實作(二):ConvertToWordArray 函數完整代碼與位元操作邏輯

     編輯:關於SqlServer

MD5_ConvertToWordArray 函數實作

將輸入字串轉換為 32 位元整數陣列(Word Array),為 MD5 主運算準備資料區塊。

完整函數代碼
IF EXISTS(SELECT * FROM dbo.sysobjects 
    WHERE id = OBJECT_ID(N'[dbo].[MD5_ConvertToWordArray]') 
    AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_ConvertToWordArray]
GO

CREATE FUNCTION dbo.MD5_ConvertToWordArray(
    @sOrigMess VARCHAR(8000) = ''
)
RETURNS @tWordArray TABLE([ID] INT IDENTITY(0,1), [Word] INT)
WITH ENCRYPTION
AS
BEGIN
    IF @sOrigMess IS NULL SET @sOrigMess = ''
    
    DECLARE @iLenOfMess INT, @iWordArrayLen INT, @iPosOfWord INT
    DECLARE @iPosOfMess INT, @iCountOfWord INT
    
    SET @iLenOfMess = LEN(@sOrigMess)
    SET @iWordArrayLen = ((@iLenOfMess + 8) / 64 + 1) * 16
    SET @iCountOfWord = 0
    
    -- 初始化陣列為 0
    WHILE(@iCountOfWord < @iWordArrayLen)
    BEGIN
        INSERT INTO @tWordArray([Word]) VALUES(0)
        SET @iCountOfWord = @iCountOfWord + 1
    END
    
    -- 將字元編碼填入陣列(小端序)
    SELECT @iPosOfMess = 0, @iPosOfWord = 0, @iCountOfWord = 0
    WHILE(@iPosOfMess < @iLenOfMess)
    BEGIN
        SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4
        UPDATE @tWordArray
        SET [Word] = [Word] | dbo.MD5_LShift(UNICODE(SUBSTRING(@sOrigMess,@iPosOfMess+1,1)), @iPosOfWord*8)
        WHERE [ID] = @iCountOfWord
        SET @iPosOfMess = @iPosOfMess + 1
    END
    
    -- 附加填充位元:0x80 (10000000)
    SELECT @iCountOfWord = @iPosOfMess / 4, @iPosOfWord = @iPosOfMess % 4
    UPDATE @tWordArray
    SET [Word] = [Word] | dbo.MD5_LShift(0x80, @iPosOfWord*8)
    WHERE [ID] = @iCountOfWord
    
    -- 附加原始訊息長度(位元數),低 32 位與高 32 位
    UPDATE @tWordArray
    SET [Word] = [Word] | dbo.MD5_LShift(@iLenOfMess, 3)
    WHERE [ID] = @iWordArrayLen - 2
    
    UPDATE @tWordArray
    SET [Word] = [Word] | dbo.MD5_RShift(@iLenOfMess, 29)
    WHERE [ID] = @iWordArrayLen - 1
    
    RETURN
END
GO

核心邏輯解析

  1. 陣列長度計算: ((長度+8)/64+1)*16 確保符合 MD5 512-bit 區塊對齊
  2. 小端序編碼: 每 4 字元組成一個 32-bit 整數,位移量為 位置%4 * 8
  3. MD5 標準填充: 附加 0x80、補零、最後 64 位存放原始長度(位元數)
  4. 相依函數: 需 MD5_LShift、MD5_RShift 位元操作函數支援
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved