日期:2014-02-09  浏览次数:20841 次

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
/*****************************************************************************
* Name: MD5_ConvertTowordArray
* Description: MD5_ConvertTowordArray
*****************************************************************************/
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
  DECLARE @iwordArrayLen    INT
  DECLARE @iPosOfword      INT
  DECLARE @iPosOfMess      INT
  DECLARE @iCountOfword    INT

  SET @iLenOfMess = LEN(@sOrigMess)
  SET @iwordArrayLen = ((@iLenOfMess + 8)/64 + 1) * 16
  SET @iCountOfword = 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
  
  SELECT @iCountOfword = @iPosOfMess / 4, @iPosOfword = @iPosOfMess % 4
  UPDATE @twordArray
    SET [word] = [word] | dbo.MD5_LShift(0x80,@iPosOfword*8)
    WHERE [ID] = @iCountOfword

  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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_wordToHex]') AND xtype IN(N'FN', N'IF', N'TF'))
  DROP FUNCTION [dbo].[MD5_wordToHex]
GO
/*****************************************************************************
* Name: MD5_wordToHex
* Description: MD5_wordToHex
*****************************************************************************/
CREATE FUNCTION dbo.MD5_wordToHex(
   @iValue    INT
)
RETURNS CHAR(8)
WITH ENCRYPTION
AS
BEGIN
  DECLARE @sRes  VARCHAR(8)
  DECLARE @iTmp  INT
  DECLARE @iCount TINYINT

  SELECT @sRes = '', @iCount = 0
  WHILE(@iCount<4)
  BEGIN
    SET @iTmp = dbo.MD5_RShift(@iValue,@iCount*8) & 0x000000FF
    SET @sRes = @sRes + CASE @iTmp / 16 WHEN 0 THEN '0'
                      WHEN 1 THEN '1'
                      WHEN 2 THEN '2'
                      WHEN 3 THEN '3'
                      WHEN 4 THEN '4'
                      WHEN 5 THEN '5'
                      WHEN 6 THEN '6'
                      WHEN 7 THEN '7'
                      WHEN 8 THEN '8'
                      WHEN 9 THEN '9'
                      WHEN 10 THEN 'A'
                      WHEN 11 THEN 'B'
                      WHEN 12 THEN 'C'
                      WHEN 13 THEN 'D'
                      WHEN 14 THEN 'E'
                      WHEN 15 THEN 'F'
                      ELSE '' END
             + CASE @iTmp % 16 WHEN 0 THEN '0