`
阅读更多

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语言实现

    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...

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

    C#实现字符串SHA-256加密算法,非常好用,供大家学习参考。

    MurMurHash3:MurMurHash3算法的纯C#实现

    MurMurHash3 MurMurHash3算法的纯C#实现。

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

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

    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语言实现hash算法

    C语言实现hash算法源码,实现了sha256,sha384,sha512三种哈希算法,项目中用到的,提取出来测试使用的。

    [数据结构 算法] 数据结构算法教程 (C# 实现) (英文版)

    [Cambridge University Press] 数据结构算法教程 (C# 实现) (英文版) [Cambridge University Press] Data Structures and Algorithms Using C# (E-Book) ☆ 图书概要:☆ C# programmers: No more translating ...

    C#两级嵌套hash表

    封装hashtable的两级hash表,两个键值索引和访问。适合存放稀疏数据,如稀疏矩阵,稀疏表等结构,由于提供key-value的索引遍历,数据稀疏的情况下,相比于传统矩阵遍历的速度更快。

    hash表的应用

    Hash表应用 (必做) (查找) [问题描述]  设计散列表实现身份证查找系统,对身份证号进行Hash。 [基本要求] (1) 设每个记录有下列数据项:身份证号码(虚构,位数和编码规则与真实一致即可)、姓名、地址; ...

    C#网络应用高级编程

    3.3.1 通过Internet实现群发功能  3.3.2 在Internet上举行网络会议讨论  习题  第4章 P2P应用编程  4.1 P2P基础知识  4.2 P2P应用举例  习题  第5章 SMTP与POP3应用编程  5.1 通过应用程序...

    C#批量修改文件hash值[软件和源代码]

    资源包含可执行程序和C#源代码 本程序可在基本不改变文件可用性的情况下修改文件的hash(校验)值 选择目录之后,则批量修改目录下的全部文件的hash值 fakehash可修改为要附加的内容,点随机则随机生成附加内容 选择...

    C#获取文件哈希值的代码

    可以获取MD5的值和sha1的值简单易用,有用的朋友可以下载。

    C语言实现的Hash表(代码)

    C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。

    C#实现给定字符串生成MD5哈希的方法

    本文实例讲述了C#实现给定字符串生成MD5哈希的方法。分享给大家供大家参考。具体分析如下: 这里首先需要下面的命名空间的引用: 代码如下:System.Security.Cryptography; System.Web.Security; 主要代码如下: //...

    HASH_hash_stm32hash_stm32hash表_stm32f407_

    stm32f407平台上实现的hash算法

    uthash开源的hash函数实现

    uthash开源的hash函数实现,里面的uthash.h可用

    20多个常用的Hash算法C++ 实现

    Hash函数集合,包含主流的hash函数: nginx_hash算法,OpenSSL_hash算法,RSHash,JSHash,PJWHash,ELFHash,BKDRHash,DJBHash,DEKHash,APHash等等!

Global site tag (gtag.js) - Google Analytics