SQLServer中的MD5加密实现方法——区分32位和16位加密

本文介绍了在SQLServer中如何实现MD5加密,特别是区分32位和16位加密的方法。内容包括在实际项目中如何应用,特别是在触发器中的用法,并提供了16位和32位加密的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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
 
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
 
 
 
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
 
 
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
 
 
CREATE FUNCTION dbo.MD5_I(
@x INT
,@y INT
,@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
  RETURN(@y ^ (@x | (~@z)))
END
GO
 
 
CREATE FUNCTION dbo.MD5_H(
@x INT,
@y INT,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
  RETURN(@x ^ @y ^ @z)
END
GO
 
 
CREATE FUNCTION dbo.MD5_G(
@x INT,
@y INT,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
  RETURN((@x & @z) | (@y & (~@z)))
END
GO
 
 
CREATE FUNCTION dbo.MD5_F(
@x INT,
@y INT,
@z INT
)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
  RETURN((@x & @y) | ((~@x) & @z))
END
GO
 
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
 
 
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
 
 
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
 
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
 
 
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 -- 00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值