好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

本文实例讲述了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#程序设计有所帮助。

dy("nrwz");

查看更多关于C#计算字符串哈希值(MD5、SHA)的方法小结的详细内容...

  阅读:105次