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

news2024/11/28 18:42:00

如题。

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

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

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

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

1 文本格式

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

2 代码格式

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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1450408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python免费下载安装全流程(Python 最新版本),新手小白必看!

前言 今天换了新的电脑&#xff0c;需要重新安装python和PyCharm&#xff0c;就简单的写个教程吧~ 一、Python下载 1、进入Python官网 官网地址&#xff1a;https://www.python.org 2、点击【Downloads】展开后点击【Windows】跳转到下载python版本页面&#xff0c;选择&qu…

物联网技术的崛起:驱动智慧景区的新篇章

随着科技的飞速发展&#xff0c;物联网技术逐渐成为推动各行各业创新的重要力量。在旅游业中&#xff0c;物联网的应用为智慧景区的建设提供了有力支持&#xff0c;为游客带来了更加便捷、智能的旅游体验。本文将探讨物联网技术在智慧景区中的应用及其对旅游业的影响&#xff0…

[职场] 求职如何设置预期 #笔记#经验分享

求职如何设置预期 在求职的道路上&#xff0c;无论处于哪个年龄阶段&#xff0c;合理的就业期望值才能使我们的愿望与社会的需求相吻合&#xff0c;才能让自己在今后的工作中发挥出最大的实力与能力。 一、结合测评软件&#xff0c;明确求职目标 根据霍兰德职业兴趣测试结果&a…

解密ERP业务架构:打造高效运营与持续增长的关键

在当今竞争激烈的商业环境中&#xff0c;企业需要有效管理和整合各个部门的业务流程和信息&#xff0c;以实现高效运营和持续增长。而ERP&#xff08;企业资源规划&#xff09;系统作为一种集成的业务管理平台&#xff0c;扮演着至关重要的角色。本文将探讨ERP业务架构的重要性…

[经验] 欧阳修唐宋八大家之首是谁 #微信#知识分享#学习方法

欧阳修唐宋八大家之首是谁 1、唐宋八大家之首是谁 唐宋八大家是中国文学史上最具代表性的八位大文豪&#xff0c;他们的文学成就在中国文学史上占有重要地位&#xff0c;被誉为文学史上的“巨人”。 唐宋八大家之首&#xff0c;无疑是唐代著名诗人杜甫。他出生在一个贫苦的家…

RK3568笔记十五:触摸屏测试

若该文为原创文章&#xff0c;转载请注明原文出处。 使用正点原子的ATK-RK3568板子&#xff0c;一直在测试屏幕和视频&#xff0c;突然想到触摸屏测试&#xff0c;一直没有用过&#xff0c;原子给的demo跑的是QT系统&#xff0c;触摸功能是正常的&#xff0c;测试一下&#xf…

C语言strlen和sizeof的区别

strlen和sizeof没有联系 前者是库函数&#xff0c;统计长度的标志是是否有\0 后者是操作符。计算长度的标志是字节数量。

电脑监控屏幕软件有哪些(监控电脑屏幕的软件)

随着信息技术的迅猛发展&#xff0c;电脑屏幕监控软件已成为企业、家庭以及教育机构保护数据安全、提升工作效率以及进行行为分析的重要工具。本文将详细介绍几款主流的电脑屏幕监控软件&#xff0c;包括它们的功能、特点以及适用场景&#xff0c;帮助读者更好地了解并选择合适…

31.File文件

File文件 1. 概述2. 构造方法2.1 方法2.2 代码示例 3. 成员方法3.1 判断、获取的方法3.1.1 方法3.1.2 代码示例 3.2 创建、删除的方法3.2.1 方法3.2.2 代码示例 3.3 获取、遍历的方法3.3.1 重点方法3.3.1.1 方法3.3.1.2 代码示例 3.3.2 所有方法3.3.2.1 方法3.3.2.2 代码示例 4…

【数据结构】LRU Cache

文章目录 LRUCache LRUCache 1. LRUCache是一种缓存的替换技术&#xff0c;在CPU和main memory之间根据计算机的局部性原理&#xff0c;往往会采用SRAM技术来构建CPU和主存之间的高速缓存&#xff0c;DRAM(dynamic random access memory)用于构建主存&#xff0c;LRUCache这种…

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术&#xff0c;通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像&#xff0c;特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

STM32——OLED菜单(二级菜单)

文章目录 一.补充二. 二级菜单代码 简介&#xff1a;首先在我的51 I2C里面有OLED详细讲解&#xff0c;本期代码从51OLED基础上移植过来的&#xff0c;可以先看完那篇文章&#xff0c;在看这个&#xff0c;然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

医院三基怎么搜题答案? #学习方法#学习方法#微信

在大学生的学习过程中&#xff0c;遇到难题和疑惑是常有的事情。然而&#xff0c;随着互联网的普及和技术的发展&#xff0c;搜题和学习软件成为了大学生们解决问题的利器。今天&#xff0c;我将向大家推荐几款备受大学生喜爱的搜题和学习软件&#xff0c;帮助我们更好地应对学…

VMware虚拟机网络配置

VMware虚拟机网络配置 桥接模式NAT网络 桥接模式 桥接模式其实就是借助你宿主机上的网卡进行联网和通信&#xff0c;所以相当于虚拟机和宿主机平级&#xff0c;处于同一个网段中。 配置要点&#xff1a; 注意选择正确的宿主机网卡 查看宿主机的网络信息&#xff0c;这些信息指…

VMwareWorkstation17.0虚拟机安装Windows2.03

VMwareWorkstation17.0虚拟机安装Windows2.03 第一篇 下载Windows2.03第二篇 配置Windows2.03虚拟机机器环境第三篇 启动Windows2.03系统 第一篇 下载Windows2.03 1.Windows2.0原版软盘下载地址是 暂不提供&#xff0c;后续更新 2.Windows2.03虚拟机镜像下载地址是 Windows2…

ChatGPT高效提问—prompt实践(白领助手)

ChatGPT高效提问—prompt实践&#xff08;白领助手&#xff09; ​ 随着社会的不断发展&#xff0c;白领的比例越来越高。白领的工作通常较为繁忙&#xff0c;需要管理复杂的项目。工作量大、要求高、任务紧急&#xff0c;时间分配不当部分可能导致工作效率低下&#xff0c;任…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说&#xff0c;是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

基于微信小程序的智能社区服务小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

嵌入式中UART通信的方法

UART是一种异步全双工串行通信协议&#xff0c;由 Tx 和 Rx 两根数据线组成&#xff0c;因为没有参考时钟信号&#xff0c;所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数&#xff0c;从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…