C#实现Hash应用全解

简介: C#实现Hash应用全解1、引言HASH是根据文件内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的。Hash通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。

C#实现Hash应用全解
1、引言
HASH是根据文件内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的。

Hash

通过一定的哈希算法(典型的有MD5,SHA-1等),将一段较长的数据映射为较短小的数据,这段小数据就是大数据的哈希值。他最大的特点就是唯一性,一旦大数据发生了变化,哪怕是一个微小的变化,他的哈希值也会发生变化。类似于DNA,既然是DNA,那就保证了没有两个数据的哈希值是完全相同的。

哈希值的作用:哈希值,即HASH值,是通过对文件内容进行加密运算得到的一组二进制值,主要用途是用于文件校验或签名。正是因为这样的特点,它常常用来判断两个文件是否相同。

比如,从网络上下载某个文件,只要把这个文件原来的哈希值同下载后得到的文件的哈希值进行对比,如果相同则表示两个文件完全一致,下载过程没有损坏文件。而如果不一致,则表明下载得到的文件跟原来的文件不同,文件在下载过程中受到了损坏。Hash的应用非常广泛,主要应用于:

1.文件校验

我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5Hash算法的”数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5checksum的命令。

  1. 唯一标识

现在有十万个文件, 给你一个文件, 要你在这十万个文件中查找是否存在. 一个很笨的办法就是把每一文件都拿出来, 然后按照二进制串一一进行对比. 但是这个操作注定是比较费时的。可以用哈希算法对文件进行计算, 然后比较哈希值是否相同。 因为存在哈希冲突的情况, 你可以在相同哈希值的文件再进行二进制串比较.

  1. 数字签名

Hash算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对Hash值,又称”数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。

  1. 哈希表

在哈希表中使用哈希函数已经并不陌生了, 不再赘述。

  1. 负载均衡

比如说, 现在又多台服务器, 来了一个请求, 如何确定这个请求应该路由到哪个路由器呢?当然, 必须确保相同的请求经过路由到达同一个服务器. 一种办法就是保存一张路由关系的表, 比如客户端IP和服务器编号的映射, 但是如果客户端很多, 势必查找的时间会很长。 这时, 可以将客户端的唯一标识信息(如:IP、username等)进行哈希计算, 然后与服务器个数取模, 得到的就是服务器的编号。

  1. 分布式存储

当我们有大量数据时, 为了提高读取与写入的速度, 一般会选择将数据存储到多个服务器。 决定将文件存储到哪台服务器, 就可以通过哈希算法取模的操作来得到。

但是, 如果数据多了, 要增加服务器了, 问题就来了, 比如原来是10台服务器, 现在变成15台了, 那么原来哈希值为16的文件被分配到编号6的服务器, 现在被分配到编号1的服务器, 也就意味着所有文件都要重新计算哈希值并重新非陪服务器进行存储。 一致性哈希就是这个用途。

分布式存储

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#中的实现
///
/// Hash辅助类
///
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)));
}

}
测试与输出结果

参考文章
框架相关
微信公众号开发系列-玩转微信开发-目录汇总

RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示

RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录

RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

RDIFramework.NET代码生成器全新V3.5版本发布-重大升级

原文地址https://www.cnblogs.com/huyong/p/11294321.html

相关文章
|
3月前
|
算法 数据可视化 数据处理
Algorithms_算法专项_Hash算法的原理&哈希冲突的解决办法
Algorithms_算法专项_Hash算法的原理&哈希冲突的解决办法
19 0
|
6月前
|
存储
面试官眼前一亮:Hash冲突解决方案一览
面试官眼前一亮:Hash冲突解决方案一览
|
9月前
|
存储 编解码 NoSQL
四.Redis中那些你不知道的秘密-五大基本结构Hash的实现原理
Hash也是Redis中非常常用的一种存储结构了,Redis的hash底层用到了两种存储结构,ziplist压缩列表 和 hash 表,当存储的所有键值对的键和值的字符串长度都小于64字节,且元素个数少于512个,Redis会选择ziplist存储,这样会比较省内存,否则他会选择hashtable hash表去成,这里的hash表它底层结构和Java中的HashMap比较像,都是数组+链表,链表是为了解决hash冲突。
趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突
导读: 本文从哈希表传统设计与解决思路入手,深入浅出地引出新的设计思路:从尽量规避哈希冲突,转向了利⽤合适的哈希冲突概率来优化计算和存储效率。新的哈希表设计表明 SIMD 指令的并⾏化处理能⼒的有效应⽤能⼤幅度提升哈希表对哈希冲突的容忍能⼒,进⽽提升查询的速度,并且能帮助哈希表进⾏极致的存储空间压缩。
|
存储 JSON NoSQL
Redis Hash(Hash) 复习
哈希相当于一个二维数组,内部是无序字典。 哈希也是是一个 string 类型的 field(字段) 和 value(值) 的映射表,所以哈希特别适合用于存储对象。
170 0
|
Ubuntu 区块链
区块链哈希hash游戏技术开发详细方案(成熟代码)
区块链哈希hash游戏技术开发详细方案(成熟代码)
|
存储 缓存 负载均衡
【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)
【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)
241 0
【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)
|
存储 NoSQL 算法
【Redis核心原理专题】(1)「技术提升系列」分析探究如何实现LFU的热点key发现机制以及内部的Scan扫描技术的原理
【Redis核心原理专题】(1)「技术提升系列」分析探究如何实现LFU的热点key发现机制以及内部的Scan扫描技术的原理
136 0
【Redis核心原理专题】(1)「技术提升系列」分析探究如何实现LFU的热点key发现机制以及内部的Scan扫描技术的原理
|
存储 区块链 数据安全/隐私保护
HASH哈希游戏源码丨HASH哈希游戏系统开发(规则及详细)丨HASH哈希游戏开发成品源码部署
 区块链在防止篡改和提供对添加到链中的块的公开验证方面是独一无二的。如果一个块被修改,它的哈希值会发生变化,并且所有后续块不再指向正确的哈希值,从而使它们失效。不法分子需要遍历所有以下区块并重新计算其哈希值以修改区块链。
|
存储 安全 算法
16. 你能谈谈HashMap怎样解决hash冲突吗 (一)
16. 你能谈谈HashMap怎样解决hash冲突吗 (一)
151 0
16. 你能谈谈HashMap怎样解决hash冲突吗 (一)