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

作者:北风其凉 时间:2022-07-02 15:47:55 

本文实例讲述了C#计算字符串哈希值(MD5、SHA)的方法。分享给大家供大家参考。具体如下:

一、关于本文

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

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

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

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

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

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

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

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

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

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

二、类库中各函数代码

1. 类库结构


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HashTools
{
public class HashHelper
{
 //各个函数
}
}

2. 计算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);
}
}

3. 计算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);
}
}

4. 计算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);
}
}

5. 计算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);
}
}

6. 计算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);
}
}

7. 计算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);
}
}

8. 计算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);
}
}

9. 计算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();
}

运行结果如下:

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

希望本文所述对大家的C#程序设计有所帮助。

标签:C#,哈希,MD5,SHA
0
投稿

猜你喜欢

  • Android使用Gradle依赖配置compile、implementation与api的区别介绍

    2023-09-27 18:11:40
  • 自定义类加载器以及打破双亲委派模型解析

    2023-06-22 22:03:59
  • 使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    2023-04-24 07:35:45
  • Java 按行读取文件按行写入文件并以空格分割字符串的方法

    2023-08-31 12:32:21
  • java实现ftp上传 如何创建文件夹

    2021-06-10 10:49:17
  • 教你如何监控 Java 线程池运行状态的操作(必看)

    2023-02-09 04:34:13
  • linux系统 java环境变量的配置方法

    2022-12-10 09:34:11
  • Android解决所有双击优化的问题

    2023-07-27 09:07:03
  • Java设计模式之迭代模式(Iterator模式)介绍

    2022-07-24 16:03:29
  • Java实现带GUI的气泡诗词效果

    2022-09-12 18:04:48
  • Java SpringMVC框架开发之数据导出Excel文件格式实例详解

    2023-11-10 21:11:18
  • Java读取.properties配置文件方法示例

    2023-08-24 16:32:56
  • eclipse中maven插件安装教程

    2023-06-23 17:08:23
  • java二维数组指定不同长度实例方法

    2021-07-13 06:02:09
  • 浅谈Java封装、继承、多态特性

    2023-10-09 13:59:35
  • 详解用Spring Boot Admin来监控我们的微服务

    2022-02-12 15:18:03
  • 同时使用@LoadBalanced @RefreshScope注解负载均衡失效分析

    2023-12-07 10:59:24
  • 详解J2EE开发的网站部署到阿里云服务器的方法

    2022-06-21 07:50:16
  • Mybatis配置之typeAlias标签的用法

    2023-11-27 20:18:20
  • Java8-Stream流操作List去重问题

    2023-11-23 23:29:49
  • asp之家 软件编程 m.aspxhome.com