C#,生成字符串整数校验码(Checksum)的谷歌(Google)算法与源代码

2023-05-16

 

如题。

校验码系统是产生校验码并校验包括校验码在内的字符串的一套规则。

它可以防止在抄录和键入字符串时产生的错误。

一般生成 MD5 校验,也可以生成、进行简单、快速的 整数 校验。

谷歌开源,很实用的整数校验码生成代码。

using System;
using System.Text;

/// <summary>
/// 按Google算法计算(string)的Checksum数值
/// </summary>
public static class ChecksumHelper
{
    /// <summary>
    /// 返回无符号整数的
    /// </summary>
    /// <param name="sURL"></param>
    /// <returns></returns>
    public static uint UintValue(string sURL)
    {
        uint ch = GoogleCH(sURL);
        ch = (((ch / 7) << 2) | (((uint)(ch % 13)) & 7));
        uint[] prbuf = new uint[20];
        prbuf[0] = ch;
        for (int i = 1; i < 20; i++)
        {
            prbuf[i] = prbuf[i - 1] - 9;
        }
        ch = GoogleCH(c32to8bit(prbuf), 80);
        return ch;
    }

    /// <summary>
    /// 返回有符号的数值
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public static int Value(string url)
    {
        return (int)UintValue(url);
    }

    #region 算法核心
    private static uint GOOGLE_MAGIC = 0xE6359A60;

    private static uint zeroFill(uint a, int b)
    {
        checked
        {
            uint z = 0x80000000;
            if (Convert.ToBoolean(z & a))
            {
                a = (a >> 1);
                a &= (~z);
                a |= 0x40000000;
                a = (a >> (b - 1));
            }
            else
            {
                a = (a >> b);
            }
        }
        return a;
    }

    private static uint[] mix(uint a, uint b, uint c)
    {
        a -= b; a -= c; a ^= (uint)(zeroFill(c, 13));
        b -= c; b -= a; b ^= (uint)(a << 8);
        c -= a; c -= b; c ^= (uint)(zeroFill(b, 13));
        a -= b; a -= c; a ^= (uint)(zeroFill(c, 12));
        b -= c; b -= a; b ^= (uint)(a << 16);
        c -= a; c -= b; c ^= (uint)(zeroFill(b, 5));
        a -= b; a -= c; a ^= (uint)(zeroFill(c, 3));
        b -= c; b -= a; b ^= (uint)(a << 10);
        c -= a; c -= b; c ^= (uint)(zeroFill(b, 15));
        return new uint[3] { a, b, c };
    }

    private static uint GoogleCH(uint[] url, uint length, uint init)
    {
        if (length == 0)
        {
            length = (uint)url.Length;
        }
        uint a, b;
        a = b = 0x9E3779B9;
        uint c = init;
        int k = 0;
        uint len = length;
        uint[] m_mix = new uint[3];
        while (len >= 12)
        {
            a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
            b += (uint)(url[k + 4] + (url[k + 5] << 8) + (url[k + 6] << 16) + (url[k + 7] << 24));
            c += (uint)(url[k + 8] + (url[k + 9] << 8) + (url[k + 10] << 16) + (url[k + 11] << 24));
            m_mix = mix(a, b, c);
            a = m_mix[0]; b = m_mix[1]; c = m_mix[2];
            k += 12;
            len -= 12;
        }
        c += length;
        // all the case statements fall through
        switch (len)
        {
            case 11:
                {
                    c += (uint)(url[k + 10] << 24);
                    c += (uint)(url[k + 9] << 16);
                    c += (uint)(url[k + 8] << 8);
                    b += (uint)(url[k + 7] << 24);
                    b += (uint)(url[k + 6] << 16);
                    b += (uint)(url[k + 5] << 8);
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 10:
                {
                    c += (uint)(url[k + 9] << 16);
                    c += (uint)(url[k + 8] << 8);
                    b += (uint)(url[k + 7] << 24);
                    b += (uint)(url[k + 6] << 16);
                    b += (uint)(url[k + 5] << 8);
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 9:
                {
                    c += (uint)(url[k + 8] << 8);
                    b += (uint)(url[k + 7] << 24);
                    b += (uint)(url[k + 6] << 16);
                    b += (uint)(url[k + 5] << 8);
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            // the first byte of c is reserved for the length
            case 8:
                {
                    b += (uint)(url[k + 7] << 24);
                    b += (uint)(url[k + 6] << 16);
                    b += (uint)(url[k + 5] << 8);
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 7:
                {
                    b += (uint)(url[k + 6] << 16);
                    b += (uint)(url[k + 5] << 8);
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 6:
                {
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 5:
                {
                    b += (uint)(url[k + 4]);
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 4:
                {
                    a += (uint)(url[k + 3] << 24);
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 3:
                {
                    a += (uint)(url[k + 2] << 16);
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 2:
                {
                    a += (uint)(url[k + 1] << 8);
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 1:
                {
                    a += (uint)(url[k + 0]);
                    break;
                }
            case 0:
                //nothing left to add
                break;
        }
        m_mix = mix(a, b, c);
        // report the result
        return m_mix[2];
    }

    private static uint GoogleCH(string url, uint length)
    {
        uint[] m_urluint = new uint[url.Length];
        for (int i = 0; i < url.Length; i++)
        {
            m_urluint[i] = url[i];
        }
        return GoogleCH(m_urluint, length, GOOGLE_MAGIC);
    }

    private static uint GoogleCH(string sURL)
    {
        return GoogleCH(sURL, 0);
    }

    private static uint GoogleCH(uint[] url, uint length)
    {
        return GoogleCH(url, length, GOOGLE_MAGIC);
    }

    private static uint[] c32to8bit(uint[] arr32)
    {
        uint[] arr8 = new uint[arr32.GetLength(0) * 4 + 3];
        for (int i = 0; i < arr32.GetLength(0); i++)
        {
            for (int bitOrder = i * 4; bitOrder <= i * 4 + 3; bitOrder++)
            {
                arr8[bitOrder] = arr32[i] & 255;
                arr32[i] = zeroFill(arr32[i], 8);
            }
        }
        return arr8;
    }
    #endregion
}

POWER BY TRUFFER.CN
BY 315SOFT.COM

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#,生成字符串整数校验码(Checksum)的谷歌(Google)算法与源代码 的相关文章

随机推荐

  • js获取上个月最后一天 上个月第一天

    获取上个月第一天 var firstdate 61 new Date new Date getFullYear new Date getMonth 1 1 获取上个月最后一天 var date 61 new Date var day 61
  • opencv3颜色识别(C++)

    文章目录 opencv3颜色识别 C 43 43 目标思路1 读取图像2 对比度调整 xff08 直方图均衡 xff09 3 RGB颜色分类4 形态学去噪声 代码结果参考 opencv3颜色识别 C 43 43 目标 给定一幅图像 xff0
  • 安卓串口调试记录(包括串口通信底层知识点)

    一 有关串口通信基本知识 有关波特率计算 xff08 参考链接 xff09 第一个字节的10位 xff08 1位起始位 0 xff0c 8位数据位和1位停止位 1 xff09 共占约1 05ms xff0c 这样可计算出其波特率约为 xff
  • Android通过jni调用本地c/c++接口方法总结

    网上有网友问android的原生应用 xff0c 上层java代码如何通过jni调用本地的c c 43 43 接口或第三方动态库 xff1f 之前搞过android应用开发和底层c c 43 43 接口开发都是一个人搞定 xff0c 觉得还
  • fastadmin使用fast\Http 发送post/get/patch等请求,参数为二维数组时候报错,怎么解决?

    之前受邀回答了这么一个问题 xff1a 在后端发请求时 xff0c 如果参数里面是数组 xff0c 就会报错 34 Array to string conversion 34 xff0c 大概意思就是数组转字符串的时候出错了 先说解决方法
  • 【单片机笔记】PWM信号与PPM信号简单理解

    PPM信号是航模遥控器输出的一种标准信号 xff0c 从PPM信号中可以获取7 9个通道的遥控指令数据 PPM看起来很像PWM xff0c 很多模型爱好者对于它们产生了误解 xff0c 有些朋友认为PPM和PWM就是一回事 xff0c 其实
  • /etc/init.d/rcS 导致无法进入系统

    使用putty 和 pscp 自制了一个生产脚本 xff0c 脚本中从windows复制程序和启动文件至linux系统中 xff0c 系统重启后 xff0c 提示如下信息 xff0c 找不到 etc init d rcS文件 can spa
  • C语言实现linux环境UDP协议接收发送数据

    C语言实现linux环境UDP协议接收发送数据 说明上代码运行结果 说明 闲来无事 xff0c 写了个C语言的UDP小程序 xff0c 程序新建了两个线程 xff0c 分别用来实现UDP数据到发送和接收 需要的直接拿去用 上代码 inclu
  • 【随问】网址中的www是什么意思?HTTPS和HTTP的区别是什么?

    一旦某个单位拥有了一个域名 xff0c 它就可以自己决定是否要进一步划分其下属的子域而不需要上级结构批准 所以 xff0c 当一个单位申请到一个域名后 xff0c 如腾讯申请了一个qq com xff0c 他就可以自己划分子域 这里就出现了
  • HTTP身份认证

    文章目录 HTTP身份认证概述BASIC认证DIGEST认证SSL客户端认证基于表单认证 HTTP身份认证 概述 某些Web页面只想让特定的人浏览 xff0c 或者仅本人可见 xff0c 未达到这个目标 xff0c 必不可少的就是认证功能
  • 不应该不知道C++的常用库

    非常惭愧 xff0c 我过去也仅仅了解boost STLport这样的库 xff0c 以及一些GUI库 xff0c 但是居然有如此众多的C xff0b xff0b 库 xff0c 其实令我惊讶 当然 xff0c 这个问题应该辩证的看 xff
  • Nginx配置完毕后不准发请求头header的解决办法

    目前项目架构是vue 43 springboot前后端分离的 xff0c 前端部署在nginx上 xff0c 后端启动接口服务 xff0c 并用nginx进行反向代理 部署完毕后 xff0c 后端就是怎么收取不到shiro的header中的
  • Win10问题篇:解决AMD家CPU机械,固态硬盘混用导致的卡顿(爆音)问题。

    有的朋友使用AMD Cpu机械固态混用会有的卡顿问题 xff0c 卡顿包括 爆音 xff0c 硬盘占用突然100 xff0c 游戏卡屏 我冷静分析加百度 xff0c 是IDE ATA ATAPI控制器驱动不一致导致 xff0c 换成一样的驱
  • ARM 搭建开源NAS平台

    最近用闲置的电脑配件装了台黑群晖 xff0c 从使用角度以及省电方面考虑 xff0c 个人认为ARM架构的NAS平台相较于X86更加省电 xff0c 正好手里有一块之前调试全志T3平台闲置下来的开发板 xff0c 开发板上正好有个SATA接
  • BMP085气压传感器驱动 &MS5611经验

    BMP085是新一代的小封装气压传感器 主要用于气压温度检测 在四轴飞行器上可以用作定高检测 该传感器属于IIC总线接口 依然沿用标准IIC驱动程序 使用该传感器需要注意的是我们不能直接读出转换好的二进制温度数据或者气压数据 必须先读出一整
  • PotPlayer下载与使用

    下载安装 说起来 xff0c Potplayer的下载其实并不轻松 xff0c 它在国内是没有自己的官网 xff1b 虽然你简单百度下 xff0c 总能找到下载网站 xff0c 但是并不能保证其安全和纯净 xff0c 个人建议从这个官网下载
  • QT多界面切换(登录跳转)

    多界面切换 xff08 QT登录跳转 xff09 应用程序中经常需要在多个界面中跳转切换 xff0c 最常见的就是登录跳转 xff0c 下面是简单过程实现 程序运行时 xff0c 显示登录界面 xff0c 点击登录后跳转至界面2执行具体业务
  • STM32 GPIO简单使用

    STM32 GPIO简单使用 IO初使化配置 GPIO Init xff08 xff09 span class token punctuation span GPIO InitTypeDef GPIO InitStructure span
  • L298电机驱动模块STM32程序封装

    L298电机驱动模块STM32程序封装 程序可以控制电机驱动模块实现 前进 后退 左右转 停止 PWM速度调节 适用于多种电机奁动模块 1 适用模块 xff1a L298N电机驱动模块 TB6612F电机驱动模块 L293D电机驱动模块 2
  • C#,生成字符串整数校验码(Checksum)的谷歌(Google)算法与源代码

    如题 校验码系统是产生校验码并校验包括校验码在内的字符串的一套规则 它可以防止在抄录和键入字符串时产生的错误 一般生成 MD5 校验 xff0c 也可以生成 进行简单 快速的 整数 校验 谷歌开源 xff0c 很实用的整数校验码生成代码 u