文档章节

C# 计算字符串的哈希值(MD5、SHA)

北风其凉
 北风其凉
发布于 2014/07/23 19:25
字数 1818
阅读 6086
收藏 7

一、关于本文

本文中是一个类库,包括下面几个函数:

1)计算32位MD5码(大小写):Hash_MD5_32

2)计算16位MD5码(大小写):Hash_MD5_16

3)计算32位2重MD5码(大小写):Hash_2_MD5_32

4)计算16位2重MD5码(大小写):Hash_2_MD5_16

5)计算SHA-1码(大小写):Hash_SHA_1

6)计算SHA-256码(大小写):Hash_SHA_256

7)计算SHA-384码(大小写):Hash_SHA_384

8)计算SHA-512码(大小写):Hash_SHA_512

编译后被打包成文件HashTools.dll,其他程序可以在添加引用后对这些函数进行调用

二、类库中各函数代码

0)类库结构

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HashTools
{
    public class HashHelper
    {
        //各个函数
    }
}

1)计算32位MD5码(大小写):Hash_MD5_32

/// <summary>
/// 计算32位MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_MD5_32(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
            = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();

        //根据计算得到的Hash码翻译为MD5码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

2)计算16位MD5码(大小写):Hash_MD5_16

/// <summary>
/// 计算16位MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_MD5_16(string word, bool toUpper = true)
{
    try
    {
        string sHash = Hash_MD5_32(word).Substring(8, 16);
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

3)计算32位2重MD5码(大小写):Hash_2_MD5_32

/// <summary>
/// 计算32位2重MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_2_MD5_32(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
            = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);

        //根据计算得到的Hash码翻译为MD5码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        bytValue = System.Text.Encoding.UTF8.GetBytes(sHash);
        bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
        sHash = "";

        //根据计算得到的Hash码翻译为MD5码
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

4)计算16位2重MD5码(大小写):Hash_2_MD5_16

/// <summary>
/// 计算16位2重MD5码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_2_MD5_16(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
                = new System.Security.Cryptography.MD5CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);

        //根据计算得到的Hash码翻译为MD5码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        sHash = sHash.Substring(8, 16);

        bytValue = System.Text.Encoding.UTF8.GetBytes(sHash);
        bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
        sHash = "";

        //根据计算得到的Hash码翻译为MD5码
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        sHash = sHash.Substring(8, 16);

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

5)计算SHA-1码(大小写):Hash_SHA_1

/// <summary>
/// 计算SHA-1码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_1(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA1CryptoServiceProvider SHA1CSP
            = new System.Security.Cryptography.SHA1CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA1CSP.ComputeHash(bytValue);
        SHA1CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

6)计算SHA-256码(大小写):Hash_SHA_256

/// <summary>
/// 计算SHA-256码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_256(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA256CryptoServiceProvider SHA256CSP
            = new System.Security.Cryptography.SHA256CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA256CSP.ComputeHash(bytValue);
        SHA256CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

7)计算SHA-384码(大小写):Hash_SHA_384

/// <summary>
/// 计算SHA-384码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_384(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA384CryptoServiceProvider SHA384CSP
            = new System.Security.Cryptography.SHA384CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA384CSP.ComputeHash(bytValue);
        SHA384CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

8)计算SHA-512码(大小写):Hash_SHA_512

/// <summary>
/// 计算SHA-512码
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大写,false:英文小写</param>
/// <returns></returns>
public static string Hash_SHA_512(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA512CryptoServiceProvider SHA512CSP
            = new System.Security.Cryptography.SHA512CryptoServiceProvider();

        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA512CSP.ComputeHash(bytValue);
        SHA512CSP.Clear();

        //根据计算得到的Hash码翻译为SHA-1码
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }

        //根据大小写规则决定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

三、函数调用
建立项目ComputeHash,添加对HashTools.dll库的引用。并添加代码:

using HashTools;

然后在Main函数中添加下列代码:

static void Main(string[] args)
{
    Console.WriteLine("MD5 of \"abc\"");

    Console.WriteLine("MD5_32(Upper): {0}", 
        HashHelper.Hash_MD5_32("abc"));
    Console.WriteLine("MD5_32(Lower): {0}",
        HashHelper.Hash_MD5_32("abc", false));

    Console.WriteLine("MD5_16(Upper): {0}",
        HashHelper.Hash_MD5_16("abc"));
    Console.WriteLine("MD5_16(Lower): {0}",
        HashHelper.Hash_MD5_16("abc", false));

    Console.WriteLine("2_MD5_32(Upper): {0}", 
        HashHelper.Hash_2_MD5_32("abc"));
    Console.WriteLine("2_MD5_32(Lower): {0}", 
        HashHelper.Hash_2_MD5_32("abc", false));

    Console.WriteLine("2_MD5_32(Upper): {0}", 
        HashHelper.Hash_2_MD5_16("abc"));
    Console.WriteLine("2_MD5_32(Lower): {0}", 
        HashHelper.Hash_2_MD5_16("abc", false));

    Console.WriteLine("SHA of \"abc\"");

    Console.WriteLine("SHA-1(Upper): {0}", 
        HashHelper.Hash_SHA_1("abc"));
    Console.WriteLine("SHA-1(Lower): {0}", 
        HashHelper.Hash_SHA_1("abc", false));

    Console.WriteLine("SHA-256(Upper): {0}",
        HashHelper.Hash_SHA_256("abc"));
    Console.WriteLine("SHA-256(Lower): {0}",
        HashHelper.Hash_SHA_256("abc", false));

    Console.WriteLine("SHA-384(Upper): {0}",
        HashHelper.Hash_SHA_384("abc"));
    Console.WriteLine("SHA-384(Lower): {0}",
        HashHelper.Hash_SHA_384("abc", false));

    Console.WriteLine("SHA-512(Upper): {0}", 
        HashHelper.Hash_SHA_512("abc"));
    Console.WriteLine("SHA-512(Lower): {0}", 
        HashHelper.Hash_SHA_512("abc", false));

    Console.ReadLine();
}

运行结果如下:

END

© 著作权归作者所有

北风其凉

北风其凉

粉丝 119
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
加载中

评论(2)

北风其凉
北风其凉 博主

引用来自“真实”的评论

不错
谢谢! :-)
真实
真实
不错
哈希算法MD5和SHA1的C#实现

/**// 哈希算法MD5和SHA1的C#实现 * 夏春涛 Email:xChuntao@163.com * Blog:http://bluesky521.cnblogs.com 运行环境:.net2.0 framework / /**// 关于哈希函数: * 哈希函数将任意长度的二进...

夏春涛
2007/12/19
0
0
C# 计算MD5值

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading; namespace CSharp1{ }...

卓尔
2016/12/11
48
0
『学概念找员外』哈希函数之碰撞阻力

至于什么是哈希,员外之前已经写过对应的文章了,所以在此就不再赘述了,如有需要,请翻阅:『学概念找员外』哈希到底是什么?。然后我们接下来会深挖哈希的几个特性,今天先说哈希函数的碰撞...

刘员外__
2018/12/18
0
0
.NET哈希函数包--KinsHash

哈希函数是现代密码系统的基础。 这些函数将任意长度的二进制字符串映射为固定长度的小二进制字符串(称为哈希值)。 加密哈希函数有这样一个属性:在计算时不可能将两个不同的输入通过哈希算...

匿名
2010/05/28
1K
0
.NET平台开源项目速览(12)哈希算法集合类库HashLib

阅读目录 1.哈希算法介绍 2.HashLib功能介绍 .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能。实际上,大部分情况下已经满足了需求,...

老朱第八
2017/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
55分钟前
3
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部