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

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖