MD5算法的T-SQL实现(FOR SQL2000)(一)

2023-12-17 06:18

本文主要是介绍MD5算法的T-SQL实现(FOR SQL2000)(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*****************************************************************************
* Name: T-SQL MD5算法实现
* Author:  Rambo Qian
* Create Date: 2003-04-10
* Last Modified by: Rambo Qian
* Last Update Date: 2003-04-16
* Version: V1.0.00
*****************************************************************************/
GO

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_OnBits]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_m_OnBits]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_m_2Power]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_m_2Power]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_LShift]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_LShift]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_RShift]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_RShift]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_RotateLeft]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_RotateLeft]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_AddUnsigned]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_AddUnsigned]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_F]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_F]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_G]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_G]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_H]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_H]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_I]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_I]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_FF]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_FF]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_GG]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_GG]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_HH]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_HH]
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

IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MD5_II]') AND xtype IN(N'FN', N'IF', N'TF'))
    DROP FUNCTION [dbo].[MD5_II]
GO
/*****************************************************************************
* 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

 

这篇关于MD5算法的T-SQL实现(FOR SQL2000)(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503380

相关文章

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.