Toggle navigation
首页
产品中心
全新RDIF.vNext低代码框架
镇店
.NET C/S开发框架
.NET Web敏捷开发框架
.NET 快速开发框架(全新EasyUI版本)
.NET 代码生成器
.NET WebAPI服务端开发框架
客户案例
付款方式
国思学堂
技术文章
新闻资讯
下载
关于
首页
技术文章
RDIF.NET
正文
原创
2019-08-03
浏览 (
9978
)
C#实现Hash应用全解
## 1、引言 ## HASH是根据文件内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的。 ![Hash](http://doc.rdiframework.net/blog/article/20190803112421279.png-pw) 通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他最大的特点就是唯一性,一旦大数据发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化。类似于DNA,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的。 哈希值的作用:哈希值,即HASH值,是通过对文件内容进行加密运算得到的一组二进制值,主要用途是用于文件校验或签名。正是因为这样的特点,它常常用来判断两个文件是否相同。 比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后得到的文件的哈希值进行对比,如果相同则表示两个文件完全一致,下载过程没有损坏文件。而如果不一致,则表明下载得到的文件跟原来的文件不同,文件在下载过程中受到了损坏。Hash的应用非常广泛,主要应用于: 1. 文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5Hash算法的”数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5checksum的命令。 2. 唯一标识 现在有十万个文件, 给你一个文件, 要你在这十万个文件中查找是否存在. 一个很笨的办法就是把每一文件都拿出来, 然后按照二进制串一一进行对比. 但是这个操作注定是比较费时的。可以用哈希算法对文件进行计算, 然后比较哈希值是否相同。 因为存在哈希冲突的情况, 你可以在相同哈希值的文件再进行二进制串比较. 3. 数字签名 Hash算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对Hash值,又称”数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。 4. 哈希表 在哈希表中使用哈希函数已经并不陌生了, 不再赘述。 5. 负载均衡 比如说, 现在又多台服务器, 来了一个请求, 如何确定这个请求应该路由到哪个路由器呢?当然, 必须确保相同的请求经过路由到达同一个服务器. 一种办法就是保存一张路由关系的表, 比如客户端IP和服务器编号的映射, 但是如果客户端很多, 势必查找的时间会很长。 这时, 可以将客户端的唯一标识信息(如:IP、username等)进行哈希计算, 然后与服务器个数取模, 得到的就是服务器的编号。 6. 分布式存储 当我们有大量数据时, 为了提高读取与写入的速度, 一般会选择将数据存储到多个服务器。 决定将文件存储到哪台服务器, 就可以通过哈希算法取模的操作来得到。 但是, 如果数据多了, 要增加服务器了, 问题就来了, 比如原来是10台服务器, 现在变成15台了, 那么原来哈希值为16的文件被分配到编号6的服务器, 现在被分配到编号1的服务器, 也就意味着所有文件都要重新计算哈希值并重新非陪服务器进行存储。 一致性哈希就是这个用途。 ![分布式存储](http://doc.rdiframework.net/blog/article/20190803112439176.png-pw) ## 2、C#开发用于计算文件Hash的辅助类HashHelper ## 在C#中,数据的Hash以MD5或SHA1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比MD5强度高。 ### 2.1、SHA-1和MD5的比较 ### 因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同: 1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。 2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。 3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢。 ### 2.2、SHA-1和MD5在C#中的实现 ### /// <summary> /// Hash辅助类 /// </summary> public class HashHelper { /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName">要计算 MD5 值的文件名和路径</param> /// <returns>MD5 值16进制字符串</returns> public static string MD5File(string fileName) { return HashFile(fileName, "md5"); } /// <summary> /// 计算文件的 sha1 值 /// </summary> /// <param name="fileName">要计算 sha1 值的文件名和路径</param> /// <returns>sha1 值16进制字符串</returns> public static string SHA1File(string fileName) { return HashFile(fileName, "sha1"); } /// <summary> /// 计算文件的哈希值 /// </summary> /// <param name="fileName">要计算哈希值的文件名和路径</param> /// <param name="algName">算法:sha1,md5</param> /// <returns>哈希值16进制字符串</returns> private static string HashFile(string fileName, string algName) { if (!System.IO.File.Exists(fileName)) { return string.Empty; } System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); byte[] hashBytes = HashData(fs, algName); fs.Close(); return ByteArrayToHexString(hashBytes); } /// <summary> /// 计算哈希值 /// </summary> /// <param name="stream">要计算哈希值的 Stream</param> /// <param name="algName">算法:sha1,md5</param> /// <returns>哈希值字节数组</returns> private static byte[] HashData(System.IO.Stream stream, string algName) { System.Security.Cryptography.HashAlgorithm algorithm; if (algName == null) { throw new ArgumentNullException("algName 不能为 null"); } if (string.Compare(algName, "sha1", true) == 0) { algorithm = System.Security.Cryptography.SHA1.Create(); } else { if (string.Compare(algName, "md5", true) != 0) { throw new Exception("algName 只能使用 sha1 或 md5"); } algorithm = System.Security.Cryptography.MD5.Create(); } return algorithm.ComputeHash(stream); } /// <summary> /// 字节数组转换为16进制表示的字符串 /// </summary> private static string ByteArrayToHexString(byte[] buf) { return BitConverter.ToString(buf).Replace("-", ""); } } ### 2.2、SHA-1和MD5在C#中的实现的测试用例 ### [TestClass] public class HashHelperUnitTest { [TestMethod] public void TestMethod1() { string fileName = @"D:\TempTest\RDIFramework.BizLogic.dll"; Assert.AreEqual(0, 0); //01.计算文件的 MD5 值 Console.WriteLine(string.Format("计算文件的 MD5 值:{0}", HashHelper.MD5File(fileName))); //02.计算文件的 sha1 值 Console.WriteLine(string.Format("计算文件的 sha1 值:{0}", HashHelper.SHA1File(fileName))); } } ![测试与输出结果](http://doc.rdiframework.net/blog/article/20190803112457909.png-pw) ## 参考文章 ## ### 框架相关 ### - [微信公众号开发系列-玩转微信开发-目录汇总](http://www.guosisoft.com/article/detail/216) - [RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示](http://www.guosisoft.com/article/detail/221) - [RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录](http://www.guosisoft.com/article/detail/190) - [RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍](http://www.guosisoft.com/article/detail/169) - [RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用](http://www.guosisoft.com/article/detail/189) - [RDIFramework.NET代码生成器全新V3.5版本发布-重大升级](http://www.guosisoft.com/article/detail/199) ----- 一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。 RDIFramework.NET官方网站:http://www.rdiframework.net/ RDIFramework.NET官方博客:http://blog.rdiframework.net/ 同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏! RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用! 欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。 扫描二维码立即关注 ![微信号:guosisoft](http://doc.rdiframework.net/weixin.png)
正文到此结束
本文标签:
.NET
挨踢业界
其他
RDIF.NET
常用工具
版权声明:
本站原创文章,由
guosisoft.com
发布,遵循
CC 4.0 by-sa
版权协议,转载请附上原文出处链接和本声明。
上一篇
Quartz.Net实现作业定时调度详解
下一篇
RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理
热门推荐
{{article.title}}
热门指数:
浏览({{article.lookCount + 5000}})
相关文章
{{article.title}}
该篇文章的评论功能暂时被站长关闭
说给你听
本文目录
文章标签
RDIF.NET
其他
微信开发
.NET
消息交互
.NetCore
项目管理
常用工具
工作流
Web前端
数据库
挨踢业界
随机文章
解放双手,markdown文章神器,Typora+PicGo+七牛云图床实现自动上传图片
信息系统项目管理系列之十:项目人力资源管理
RDIFramework.NET平台代码生成器V3.1.6125.27586全新发布-更新于20161029(提供下载)
后台界面设计之表单设计规范参考
信息系统项目管理系列之四:项目可行性研究与评估
团队项目开发"编码规范"之八:代码格式检查
史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范
使用Jquery+EasyUI 进行框架项目开发案例讲解之五--模块(菜单)管理源码分享
RDIFramework.NET敏捷开发框架 ━ 工作流程组件Web业务平台-3.6Ace版本
.NET快速信息化系统开发框架 V3.2->新增“行政区域管理”,同时大批量树采用异步加载
RDIFramework.NET敏捷开发框架WinForm新增通用附件管理控件
RDIFramework.NET V3.2->新增模块管理界面导出功能(可按条件导出)
.NET快速信息化系统开发框架 V3.2 新增解压缩工具类ZipHelper
书写高质量JavaScript代码的要义(The Essentials of Writing High Quality JavaScript)翻译
RDIFramework.NET V3.3 Web版新增日程管理功能模块
.NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)
微信公众号开发C#系列-11、生成带参数二维码应用场景
史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天
.NET快速信息化系统开发框架 V3.2 ->WinForm部分全部重构为Dev风格界面
网站信息
文章总数:599 篇
标签总数:8 个
分类总数:8 个
留言数量:1385 条
在线人数:
89
人
运行天数:1321天
最后更新:2023-05-18
QQ:406590790
13005007127