MD5算法的T-SQL实现(FORSQL2000)(二)

来源:互联网 发布:恒大足校 知乎 编辑:程序博客网 时间:2024/05/29 21:18
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

IFEXISTS(SELECT*FROMDbo.sysobjectsWHEREid=OBJECT_ID(N'[dbo].[MD5_ConvertToArray]')ANDxtypeIN(N'FN',N'IF',N'TF'))
  DROPFUNCTION[dbo].[MD5_ConvertToWordArray]
GO
/*****************************************************************************
*Name:MD5_ConvertToWordArray
*Description:MD5_ConvertToWordArray
*****************************************************************************/
CREATEFUNCTIONdbo.MD5_ConvertToWordArray(
  @sOrigMess    VARCHAR(8000)  ='
)
RETURNS@tWordArrayTABLE([ID]INTIDENTITY(0,1),[Word]INT)
WITHENCRYPTION
AS
BEGIN
  IF@sOrigMessISNULL
    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
    INSERTINTO@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

IFEXISTS(SELECT*FROMDbo.sysobjectsWHEREid=OBJECT_ID(N'[dbo].[MD5_WordToHex]')ANDxtypeIN(N'FN',N'IF',N'TF'))
  DROPFUNCTION[dbo].[MD5_WordToHex]
GO
/*****************************************************************************
*Name:MD5_WordToHex
*Description:MD5_WordToHex
*****************************************************************************/
CREATEFUNCTIONdbo.MD5_WordToHex(
  @iValue    INT
)
RETURNSCHAR(8)
WITHENCRYPTION
AS
BEGIN
  DECLARE@sRes  VARCHAR(8)
  DECLARE@iTmp  INT
  DECLARE@iCountTINYINT

  SELECT@sRes=',@iCount=0
  WHILE(@iCount<4)
  BEGIN
    SET@iTmp=dbo.MD5_RShift(@iValue,@iCount*8)&0x000000FF
    SET@sRes=@sRes+CASE@iTmp/16WHEN0 THEN'0'
                      WHEN1 THEN'1'
                      WHEN2 THEN'2'
                      WHEN3 THEN'3'
                      WHEN4 THEN'4'
                      WHEN5 THEN'5'1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击