1. /// <summary>
  2. /// 提供用于计算指定文件哈希值的方法
  3. /// <example>例如计算文件的MD5值:
  4. /// <code>
  5. /// String hashMd5=HashHelper.ComputeMD5("MyFile.txt");
  6. /// </code>
  7. /// </example>
  8. /// <example>例如计算文件的CRC32值:
  9. /// <code>
  10. /// String hashCrc32 = HashHelper.ComputeCRC32("MyFile.txt");
  11. /// </code>
  12. /// </example>
  13. /// <example>例如计算文件的SHA1值:
  14. /// <code>
  15. /// String hashSha1 =HashHelper.ComputeSHA1("MyFile.txt");
  16. /// </code>
  17. /// </example>
  18. /// </summary>
  19. public sealed class HashHelper
  20. {
  21. /// <summary>
  22. /// 计算指定文件的MD5值
  23. /// </summary>
  24. /// <param name="fileName">指定文件的完全限定名称</param>
  25. /// <returns>返回值的字符串形式</returns>
  26. public static String ComputeMD5(String fileName)
  27. {
  28. String hashMD5 = String.Empty;
  29. //检查文件是否存在,如果文件存在则进行计算,否则返回空值
  30. if (System.IO.File.Exists(fileName))
  31. {
  32. using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
  33. {
  34. //计算文件的MD5值
  35. System.Security.Cryptography.MD5 calculator=System.Security.Cryptography.MD5.Create();
  36. Byte[] buffer = calculator.ComputeHash(fs);
  37. calculator.Clear();
  38. //将字节数组转换成十六进制的字符串形式
  39. StringBuilder stringBuilder = new StringBuilder();
  40. for (int i = ; i < buffer.Length; i++)
  41. {
  42. stringBuilder.Append(buffer[i].ToString("x2"));
  43. }
  44. hashMD5= stringBuilder.ToString();
  45. }//关闭文件流
  46. }//结束计算
  47. return hashMD5;
  48. }//ComputeMD5
  49. /// <summary>
  50. /// 计算指定文件的CRC32值
  51. /// </summary>
  52. /// <param name="fileName">指定文件的完全限定名称</param>
  53. /// <returns>返回值的字符串形式</returns>
  54. public static String ComputeCRC32(String fileName)
  55. {
  56. String hashCRC32 = String.Empty;
  57. //检查文件是否存在,如果文件存在则进行计算,否则返回空值
  58. if (System.IO.File.Exists(fileName))
  59. {
  60. using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
  61. {
  62. //计算文件的CSC32值
  63. Crc32 calculator = new Crc32();
  64. Byte[] buffer = calculator.ComputeHash(fs);
  65. calculator.Clear();
  66. //将字节数组转换成十六进制的字符串形式
  67. StringBuilder stringBuilder = new StringBuilder();
  68. for (int i = ; i < buffer.Length; i++)
  69. {
  70. stringBuilder.Append(buffer[i].ToString("x2"));
  71. }
  72. hashCRC32 = stringBuilder.ToString();
  73. }//关闭文件流
  74. }
  75. return hashCRC32;
  76. }//ComputeCRC32
  77. /// <summary>
  78. /// 计算指定文件的SHA1值
  79. /// </summary>
  80. /// <param name="fileName">指定文件的完全限定名称</param>
  81. /// <returns>返回值的字符串形式</returns>
  82. public static String ComputeSHA1(String fileName)
  83. {
  84. String hashSHA1 = String.Empty;
  85. //检查文件是否存在,如果文件存在则进行计算,否则返回空值
  86. if (System.IO.File.Exists(fileName))
  87. {
  88. using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
  89. {
  90. //计算文件的SHA1值
  91. System.Security.Cryptography.SHA1 calculator = System.Security.Cryptography.SHA1.Create();
  92. Byte[] buffer = calculator.ComputeHash(fs);
  93. calculator.Clear();
  94. //将字节数组转换成十六进制的字符串形式
  95. StringBuilder stringBuilder = new StringBuilder();
  96. for (int i = ; i < buffer.Length; i++)
  97. {
  98. stringBuilder.Append(buffer[i].ToString("x2"));
  99. }
  100. hashSHA1 = stringBuilder.ToString();
  101. }//关闭文件流
  102. }
  103. return hashSHA1;
  104. }//ComputeSHA1
  105. }//end class: HashHelper
  106. /// <summary>
  107. /// 提供 CRC32 算法的实现
  108. /// </summary>
  109. public class Crc32 : System.Security.Cryptography.HashAlgorithm
  110. {
  111. public const UInt32 DefaultPolynomial = 0xedb88320;
  112. public const UInt32 DefaultSeed = 0xffffffff;
  113. private UInt32 hash;
  114. private UInt32 seed;
  115. private UInt32[] table;
  116. private static UInt32[] defaultTable;
  117. public Crc32()
  118. {
  119. table = InitializeTable(DefaultPolynomial);
  120. seed = DefaultSeed;
  121. Initialize();
  122. }
  123. public Crc32(UInt32 polynomial, UInt32 seed)
  124. {
  125. table = InitializeTable(polynomial);
  126. this.seed = seed;
  127. Initialize();
  128. }
  129. public override void Initialize()
  130. {
  131. hash = seed;
  132. }
  133. protected override void HashCore(byte[] buffer, int start, int length)
  134. {
  135. hash = CalculateHash(table, hash, buffer, start, length);
  136. }
  137. protected override byte[] HashFinal()
  138. {
  139. byte[] hashBuffer = UInt32ToBigEndianBytes(~hash);
  140. this.HashValue = hashBuffer;
  141. return hashBuffer;
  142. }
  143. public static UInt32 Compute(byte[] buffer)
  144. {
  145. return ~CalculateHash(InitializeTable(DefaultPolynomial), DefaultSeed, buffer, , buffer.Length);
  146. }
  147. public static UInt32 Compute(UInt32 seed, byte[] buffer)
  148. {
  149. return ~CalculateHash(InitializeTable(DefaultPolynomial), seed, buffer, , buffer.Length);
  150. }
  151. public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer)
  152. {
  153. return ~CalculateHash(InitializeTable(polynomial), seed, buffer, , buffer.Length);
  154. }
  155. private static UInt32[] InitializeTable(UInt32 polynomial)
  156. {
  157. if (polynomial == DefaultPolynomial && defaultTable != null)
  158. {
  159. return defaultTable;
  160. }
  161. UInt32[] createTable = new UInt32[];
  162. for (int i = ; i < ; i++)
  163. {
  164. UInt32 entry = (UInt32)i;
  165. for (int j = ; j < ; j++)
  166. {
  167. if ((entry & ) == )
  168. entry = (entry >> ) ^ polynomial;
  169. else
  170. entry = entry >> ;
  171. }
  172. createTable[i] = entry;
  173. }
  174. if (polynomial == DefaultPolynomial)
  175. {
  176. defaultTable = createTable;
  177. }
  178. return createTable;
  179. }
  180. private static UInt32 CalculateHash(UInt32[] table, UInt32 seed, byte[] buffer, int start, int size)
  181. {
  182. UInt32 crc = seed;
  183. for (int i = start; i < size; i++)
  184. {
  185. unchecked
  186. {
  187. crc = (crc >> ) ^ table[buffer[i] ^ crc & 0xff];
  188. }
  189. }
  190. return crc;
  191. }
  192. private byte[] UInt32ToBigEndianBytes(UInt32 x)
  193. {
  194. return new byte[] { (byte)((x >> ) & 0xff), (byte)((x >> ) & 0xff), (byte)((x >> ) & 0xff), (byte)(x & 0xff) };
  195. }
  196. }//end class: Crc32

C# 计算文件的 Hash 值的更多相关文章

  1. 【转】Java计算文件的hash值

    原文地址:http://blog.csdn.net/qq_25646191/article/details/78863110 如何知道一个文件是否改变了呢?当然是用比较文件hash值的方法,文件has ...

  2. powershell中使用Get-FileHash计算文件的hash值

    今天在公司一台windows服务器上.需要对两个文件进行比对,笔者首先就想到了可以使用md5校验 但是公司服务器上又不可以随意安装软件,于是笔者想到了可以试试windows自带的powershell中 ...

  3. C#计算文件的MD5值实例

    C#计算文件的MD5值实例 MD5 是 Message Digest Algorithm 5(信息摘要算法)的缩写,MD5 一种散列(Hash)技术,广泛用于加密.解密.数据签名和数据完整性校验等方面 ...

  4. C# 计算文件的HASH

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

  5. c#计算文件的MD5值

    代码: /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName" ...

  6. 计算文件的MD5值和sha256值

    1.计算文件的MD5值. 1)linux系统计算 MD5值:md5sum+文件名 sha256值:sha256su+文件名 2)windows系统计算 MD5值:利用Notepad++工具计算 sha ...

  7. 在.NET中计算文件的MD5值

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...

  8. python计算文件的md5值

    前言 最近要开发一个基于python的合并文件夹/目录的程序,本来的想法是基于修改时间的比较,即判断文件有没有改变,比较两个文件的修改时间即可.这个想法在windows的pc端下测试没有问题. 但是当 ...

  9. 计算文件的MD5值(Java & Rust)

    Java public class TestFileMD5 { public final static String[] hexDigits = { "0", "1&qu ...

随机推荐

  1. JAVA 反射应用:properties2Object

    MixAll.java import java.lang.reflect.Method; import java.util.Properties; public class MixAll { /** ...

  2. [转]Oracle关于null的处理

    转至:http://www.2cto.com/database/201209/157606.html 关于空值null的排序问题   Oracle排序中NULL值处理的五种常用方法:    1.缺省O ...

  3. freemarker截取字符串subString

    转至:http://fengzhijie1103.iteye.com/blog/1142918 freemarker截取字符串其实和JAVA语法是差不多了,也有substring 方法       如 ...

  4. Bootstrap 列偏移\列嵌套\列排序

    1.列偏移 这个其实很简单就是通过一个样式类,通过.col-md-offset-*可以将列偏移到右侧.这些class通过使用*选择器将所有列增加了列的左侧margin.例如,.col-md-offse ...

  5. pygame “音乐盒”---- 播放一首歌& 点击对话框后背景以及对话框大小改变

    有时,你用pygame写的游戏也许需要播放一些背景音乐,该怎么做呢,直接上代码: 下面的代码,有关于: 1>设置对话框图标.大小.标题 2>播放音乐 3>设置背景图片,以及获取背景图 ...

  6. 创建虚拟交换机(New-VMSwitch)

    #获取网卡列表Get-NetAdapter

  7. 【转】shell脚本处理字符串的常用方法

    转自:http://blog.csdn.net/linfeng999/article/details/6661233 1. 构造字符串 直接构造 STR_ZERO=hello #shell中等号左右的 ...

  8. delphi 选中的展开0级 子级不展开

    TreeView1.Selected.Expand(False); //选中的展开0级 子级不展开 TreeView1.Selected.Expand(True); //全部展开 来自为知笔记(Wiz ...

  9. UML视图(九)部署图

    一.什么是部署图? 部署图对面向对象系统的物理方面建模,描写叙述系统执行时节点.构件实例及其对象的配置.主要用来在部署系统时涉及到的硬件(处理器和设备)进行建模. 二.部署图的组成元素? 部署图主要包 ...

  10. Windows下codeblocks的安装与配置

    最近自己正好要使用codeblocks编写C++程序,安装好却发现无法编译,如果您也遇到相似问题,可以参考本文. 如果您已安装codeblocks,想转换成中文界面,直接参考Step 2. 如果您C程 ...