当前位置: 首页 > 图文教程 > 数据库 > MSSQL > MD5算法的T-SQL实现(FOR SQL2000)(二)

MSSQL
MD5算法的T-SQL实现(FOR SQL2000)(一)
MD5算法的T-SQL实现(FOR SQL2000)(二)
《高性能的数据库》 第四讲 编程细节(1)
《高性能的数据库》 第四讲 编程细节(2)
MySQL安全性指南 (1)
MySQL安全性指南 (2)
MySQL安全性指南(3)
SQL Server数据库技术(01)
SQL Server数据库技术(02)
SQL Server数据库技术(03)
SQL Server数据库技术(04)
SQL Server数据库技术(05)
SQL Server数据库技术(06)
SQL Server数据库技术(07)
SQL Server数据库技术(08)
SQL Server数据库技术(09)
SQL Server数据库技术(10)
SQL Server数据库技术(11)
SQL Server数据库技术(12)
SQL Server数据库技术(13)

MSSQL 中的 MD5算法的T-SQL实现(FOR SQL2000)(二)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 59 ::
收藏到网摘: n/a

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'