远行的心 发表于 2018-10-16 06:47:39

SQL Server中的MD5实现方法

  --SQL Server中的MD5实现方法
  /*****************************************************************************
  * Name: MD5_II
  * Description: MD5_II
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_II(
  @a INT,
  @b INT,
  @c INT,
  @d INT,
  @x INT,
  @s INT,
  @ac INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_I(@b, @c, @d), @x), @ac))
  SET @a = dbo.MD5_RotateLeft(@a, @s)
  SET @a = dbo.MD5_AddUnsigned(@a, @b)
  RETURN(@a)
  END
  GO
  /*****************************************************************************
  * Name: MD5_HH
  * Description: MD5_HH
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_HH(
  @a INT,
  @b INT,
  @c INT,
  @d INT,
  @x INT,
  @s INT,
  @ac INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_H(@b, @c, @d), @x), @ac))
  SET @a = dbo.MD5_RotateLeft(@a, @s)
  SET @a = dbo.MD5_AddUnsigned(@a, @b)
  RETURN(@a)
  END
  GO
  /*****************************************************************************
  * Name: MD5_GG
  * Description: MD5_GG
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_GG(
  @a INT,
  @b INT,
  @c INT,
  @d INT,
  @x INT,
  @s INT,
  @ac INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_G(@b, @c, @d), @x), @ac))
  SET @a = dbo.MD5_RotateLeft(@a, @s)
  SET @a = dbo.MD5_AddUnsigned(@a, @b)
  RETURN(@a)
  END
  GO
  /*****************************************************************************
  * Name: MD5_FF
  * Description: MD5_FF
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_FF(
  @a INT,
  @b INT,
  @c INT,
  @d INT,
  @x INT,
  @s INT,
  @ac INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  SET @a = dbo.MD5_AddUnsigned(@a, dbo.MD5_AddUnsigned(dbo.MD5_AddUnsigned(dbo.MD5_F(@b, @c, @d), @x), @ac))
  SET @a = dbo.MD5_RotateLeft(@a, @s)
  SET @a = dbo.MD5_AddUnsigned(@a, @b)
  RETURN(@a)
  END
  GO
  /*****************************************************************************
  * Name: MD5_I
  * Description: MD5_I
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_I(
  @x INT
  ,@y INT
  ,@z INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  RETURN(@y ^ (@x | (~@z)))
  END
  GO
  /*****************************************************************************
  * Name: MD5_H
  * Description: MD5_H
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_H(
  @x INT,
  @y INT,
  @z INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  RETURN(@x ^ @y ^ @z)
  END
  GO
  /*****************************************************************************
  * Name: MD5_G
  * Description: MD5_G
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_G(
  @x INT,
  @y INT,
  @z INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  RETURN((@x & @z) | (@y & (~@z)))
  END
  GO
  /*****************************************************************************
  * Name: MD5_F
  * Description: MD5_F
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_F(
  @x INT,
  @y INT,
  @z INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  RETURN((@x & @y) | ((~@x) & @z))
  END
  GO
  /*****************************************************************************
  * Name: MD5_AddUnsigned
  * Description: MD5_AddUnsigned
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_AddUnsigned(
  @iX INT,
  @iY INT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  DECLARE @iRes BIGINT
  SET @iRes = CAST(CAST(@iX AS BINARY(8)) AS BIGINT) + CAST(CAST(@iY AS BINARY(8)) AS BIGINT)
  RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
  END
  GO
  /*****************************************************************************
  * Name: MD5_RotateLeft
  * Description: MD5_RotateLeft
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_RotateLeft(
  @iValue INT,
  @iShiftBits TINYINT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  RETURN(dbo.MD5_LShift(@iValue, @iShiftBits) | dbo.MD5_RShift(@iValue, (32 - @iShiftBits)))
  END
  GO
  /*****************************************************************************
  * Name: MD5_RShift
  * Description: MD5_RShift
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_RShift(
  @iValue INT ,
  @iShiftBits TINYINT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  DECLARE @iRes BIGINT
  SET @iRes = CAST(@iValue AS BINARY(8))
  SET @iRes = @iRes / dbo.MD5_m_2Power(@iShiftBits)
  RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
  END
  GO
  /*****************************************************************************
  * Name: MD5_LShift
  * Description: MD5_LShift
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_LShift(
  @iValue INT,
  @iShiftBits TINYINT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  DECLARE @iRes BIGINT
  SET @iRes = CAST(@iValue AS BINARY(8))
  SET @iRes = @iRes * dbo.MD5_m_2Power(@iShiftBits)
  RETURN(CAST(@iRes & 0x00000000FFFFFFFF AS BINARY(4)))
  END
  GO
  /*****************************************************************************
  * Name: MD5_m_2Power
  * Description: 常数组
  *****************************************************************************/
  CREATE FUNCTION dbo.MD5_m_2Power(
  @i TINYINT
  )
  RETURNS INT
  WITH ENCRYPTION
  AS
  BEGIN
  DECLARE @iRes INT
  SELECT @iRes =
  CASE @i
  WHEN 0 THEN 1-- 00000000000000000000000000000001
  WHEN 1 THEN 2-- 00000000000000000000000000000010
  WHEN 2 THEN 4-- 00000000000000000000000000000100
  WHEN 3 THEN 8-- 00000000000000000000000000001000
  WHEN 4 THEN 16-- 00000000000000000000000000010000
  WHEN 5 THEN 32-- 00000000000000000000000000100000
  WHEN 6 THEN 64-- 00000000000000000000000001000000
  WHEN 7 THEN 128-- 00000000000000000000000010000000
  WHEN 8 THEN 256-- 00000000000000000000000100000000
  WHEN 9 THEN 512-- 00000000000000000000001000000000
  WHEN 10 THEN 1024 -- 00000000000000000000010000000000
  WHEN 11 THEN 2048 -- 00000000000000000000100000000000
  WHEN 12 THEN 4096 -- 00000000000000000001000000000000
  WHEN 13 THEN 8192 -- 00000000000000000010000000000000
  WHEN 14 THEN 16384 -- 00000000000000000100000000000000
  WHEN 15 THEN 32768 -- 00000000000000001000000000000000
  WHEN 16 THEN 65536 -- 00000000000000010000000000000000
  WHEN 17 THEN 131072 -- 00000000000000100000000000000000
  WHEN 18 THEN 262144 -- 00000000000001000000000000000000
  WHEN 19 THEN 524288 -- 00000000000010000000000000000000
  WHEN 20 THEN 1048576 -- 00000000000100000000000000000000
  WHEN 21 THEN 2097152 -- 00000000001000000000000000000000
  WHEN 22 THEN 4194304 -- 00000000010000000000000000000000
  WHEN 23 THEN 8388608 -- 00000000100000000000000000000000
  WHEN 24 THEN 16777216 -- 00000001000000000000000000000000
  WHEN 25 THEN 33554432 -- 00000010000000000000000000000000
  WHEN 26 THEN 67108864 -- 00000100000000000000000000000000
  WHEN 27 THEN 134217728 -- 00001000000000000000000000000000
  WHEN 28 THEN 268435456 -- 00010000000000000000000000000000
  WHEN 29 THEN 536870912 -- 00100000000000000000000000000000
  WHEN 30 THEN 1073741824 -- 01000000000000000000000000000000
  ELSE 0
  END
  RETURN(@iRes)
  END
  GO
  /*****************************************************************************
  * Name: MD5_m_OnBits
  * Description: 常数组
  *****************************************************************************/
  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-- 00000000000000000000000000000001
  WHEN 1 THEN 3-- 00000000000000000000000000000011
  WHEN 2 THEN 7-- 00000000000000000000000000000111
  WHEN 3 THEN 15-- 00000000000000000000000000001111
  WHEN 4 THEN 31 -- 00000000000000000000000000011111
  WHEN 5 THEN 63 -- 00000000000000000000000000111111
  WHEN 6 THEN 127 -- 00000000000000000000000001111111
  WHEN 7 THEN 255 -- 00000000000000000000000011111111
  WHEN 8 THEN 511 -- 00000000000000000000000111111111
  WHEN 9 THEN 1023 -- 00000000000000000000001111111111
  WHEN 10 THEN 2047 -- 00000000000000000000011111111111
  WHEN 11 THEN 4095 -- 00000000000000000000111111111111
  WHEN 12 THEN 8191 -- 00000000000000000001111111111111
  WHEN 13 THEN 16383 -- 00000000000000000011111111111111
  WHEN 14 THEN 32767 -- 00000000000000000111111111111111
  WHEN 15 THEN 65535 -- 00000000000000001111111111111111
  WHEN 16 THEN 131071 -- 00000000000000011111111111111111
  WHEN 17 THEN 262143 -- 00000000000000111111111111111111
  WHEN 18 THEN 524287 -- 00000000000001111111111111111111
  WHEN 19 THEN 1048575 -- 00000000000011111111111111111111
  WHEN 20 THEN 2097151 -- 00000000000111111111111111111111
  WHEN 21 THEN 4194303 -- 00000000001111111111111111111111
  WHEN 22 THEN 8388607 -- 00000000011111111111111111111111
  WHEN 23 THEN 16777215 -- 00000000111111111111111111111111
  WHEN 24 THEN 33554431 -- 00000001111111111111111111111111
  WHEN 25 THEN 67108863 -- 00000011111111111111111111111111
  WHEN 26 THEN 134217727 -- 00000111111111111111111111111111
  WHEN 27 THEN 268435455 -- 00001111111111111111111111111111
  WHEN 28 THEN 536870911 -- 00011111111111111111111111111111
  WHEN 29 THEN 1073741823 -- 00111111111111111111111111111111
  WHEN 30 THEN 2147483647 -- 01111111111111111111111111111111
  ELSE 0
  END
  RETURN(@iRes)
  END
  GO
  CREATE FUNCTION dbo.MD5_ConvertToWordArray
  (
  @sOrigMess VARCHAR(8000)=''
  )

  RETURNS @tWordArray TABLE( 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
页: [1]
查看完整版本: SQL Server中的MD5实现方法