`
阅读更多

HASH是根据文件内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的。

Hash

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

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

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

  1. 文件校验

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

  1. 唯一标识

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

  2. 数字签名

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

  1. 哈希表

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

  1. 负载均衡

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

  1. 分布式存储

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

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

分布式存储

 

在C#中,数据的Hash以MD5或SHA1的方式实现,MD5与SHA1都是Hash算法,MD5输出是128位的,SHA1输出是160位的,MD5比SHA1快,SHA1比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慢。

 

/// <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("-", "");
    }
}

 

[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框架的支持者与使用者,大家可以通过下面的地址了解详情。

RDIFramework.NET官方网站:http://www.rdiframework.net/

RDIFramework.NET官方博客:http://blog.rdiframework.net/

同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!

RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!

欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。

扫描二维码立即关注

微信号:guosisoft

0
0
分享到:
评论

相关推荐

    C#实现GeoHash类文件

    C#实现GeoHash算法,将空间二维数据转化成一维字符串,下载之后请自行修改命名空间

    c语言的md5_hash代替C#的ComputeHash

    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string str = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(str)));...C#的md5 ComputeHash方法,C语言实现

    C#实现字符串SHA-256加密算法

    在C#编程环境中,实现SHA-256加密算法可以为应用程序提供强大的安全保障。 首先,我们需要理解SHA-256的工作原理。SHA-256是SHA-2家族的一员,它通过一系列复杂的数学运算(如位操作、异或、旋转等)将输入信息...

    GeoHash C#实现 找出周围8个区域的GeoHash编码

    相信找到这里的 ,geohash算法原理及实现方式应该也有所了解了。原代码了出自 邓星林博客 http://www.cnblogs.com/dengxinglin/archive/2012/12/14/2817761.html 自已找来,加上8个区的实现,加些注释和例子,测试...

    MurmurHash64B c#版

    这是MurmurHash算法,由c++改成c#版本。使用它在生500万内生成64位的数字,也是会出现碰撞的。在实际开发转,可能需要将不定长的数符中转生数字,想转生64位唯一数字的话。可以用md5算法生成16位的字节,再用Murmur...

    MurMurHash3:MurMurHash3算法的纯C#实现

    在 `MurMurHash3-master` 压缩包中,可能包含了 C# 版本的 MurMurHash3 算法源代码,包括类定义、方法实现、测试用例等。通过阅读和分析这些代码,可以更深入地理解算法的细节和 C# 版本的实现方式。同时,也可以...

    C# 实现S/Key身份认证协议

    S/Key身份认证协议是一种基于一次性口令(One-Time Password, ...总之,S/Key身份认证协议是提高网络安全的一种有效手段,而用C#来实现这一协议,可以方便地将其整合到各种.NET应用程序中,提供更强大的用户验证机制。

    DSA签名算法的C#实现

    这个`CSInteropSign`可能是一个包含C#代码示例的项目,用于演示如何在实际应用中实现DSA签名算法。代码中可能包含了生成密钥对、创建签名以及验证签名的具体实现,可以作为一个参考和学习的资源。理解并熟练运用这些...

    C#实现微信分账功能的完整步骤

    C#实现微信分账功能的完整步骤 C#实现微信分账功能是指使用C#语言实现微信提供的分账功能,微信分账功能是指在微信支付平台上,商户可以将订单金额的一部分分配给其他合作方,例如供应商、代理商等,以便于商户和...

    C#实现字符串SHA-256加密算法工程下载

    本文将详细讨论C#编程语言中实现字符串SHA-256加密算法的相关知识点。 SHA-256(Secure Hash Algorithm 256位)是一种广泛使用的密码散列函数,它能将任意长度的输入(或预映射)转换为固定长度的输出,通常是256位...

    C#实现MD5、HASH1、HASH216、HASH512、DES、加密算法

    C#实现MD5、HASH1、HASH216、HASH512、DES、加密字符串。DES加密文件加密源码。

    C# 实现3DE算法

    ### C# 实现3DES算法 #### 一、3DES算法简介 3DES(Triple Data Encryption Standard),即三重数据加密标准,是一种基于DES(Data Encryption Standard)的对称加密算法。由于DES的有效密钥长度较短(仅56位),...

    C语言实现hash算法

    本项目是用C语言实现的哈希算法,包括SHA256、SHA384和SHA512三种不同的哈希函数,这些函数是SHA-2(Secure Hash Algorithm 2)家族的一部分。 SHA-2是由美国国家安全局(NSA)设计的,包含了多种不同长度的哈希...

    ConsistentHash(Ketama)

    一致性哈希(Consistent Hashing)是一种分布式哈希(Distributed Hash Table,DHT)算法,主要用于解决在分布式系统...在实际应用中,理解并掌握一致性哈希的原理和C#实现细节,对于构建高性能的分布式系统至关重要。

    六种加密算法的C#实现源码

    在这个主题中,我们关注的是六种加密算法的C#实现。这些算法是编程实践中常见且至关重要的,尤其是在开发涉及数据安全的应用程序时。以下是这六种加密算法的简要介绍及其在C#中的应用: 1. **DES(Data Encryption ...

    C#应用程序小例大全

    4. **哈希表(Hash Table)**:C#中的Dictionary, TValue&gt;是哈希表的实现,它提供了快速的查找、添加和删除操作。哈希表通过键值对存储数据,基于键的哈希函数来定位元素,从而实现了高效的数据访问。 5. **面向...

    webqq hash算法c#版(20160218)

    webqq最新hash算法c#版,20160218完成,由webqq的js算法翻译而来。 计算结果完全一致,请放心使用。 /// /// QQ hash算法 /// /// &lt;param name="b"&gt;QQ号 /// &lt;param name="j"&gt;cookie的ptwebqq值 /// &lt;returns&gt;hash...

    C# WinForm exe程序如何实现远程升级.zip

    对于C# WinForm应用程序来说,实现远程升级能够让用户轻松地获取最新的程序版本,无需手动下载安装包。本篇将详细介绍如何利用C# WinForm实现exe程序的远程升级功能。 首先,我们需要理解远程升级的基本流程: 1. *...

Global site tag (gtag.js) - Google Analytics