zoukankan      html  css  js  c++  java
  • 《数据结构与算法之美》17——哈希算法(一)基本概念与应用

    什么是哈希算法

    将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射之后得到的二进制值串就是哈希值。

    一个优秀的哈希算法要满足几点要求:

    1. 从哈希值不能反向推导出原始数据(所以哈希算法也叫意向哈希算法);
    2. 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同;
    3. 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
    4. 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
    哈希算法的应用

    哈希算法的应用有很多,常见的有:安全加密、唯一标识、数据较验、散列函数、负载均衡、数据分片、分布式存储。

    应用一:安全加密

    说到哈希算法的应用,最先想到的就是安全加密。最常用的哈希算法是MD5和SHA。

    没有绝对安全的加密。越复杂、越难破解的加密算法,需要的计算时间也越长。

     

    应用二:唯一标识

    通过哈希算法对文件进行哈希计算,得到的哈希值作为文件的唯一标识。通过这个唯一标识可以在数据库中快速找到对应的文件。

    网盘的秒传功能就是基于这个方法实现的。在上传之前,先计算文件的哈希值,再到数据库中查找,如果找到,就直接提示上传成功。

     

    应用三:数据校验

    相信大家都用过BT下载软件吧?我们知道,BT下载的原理是基于P2P协议的。从多个机器上并行下载一个2GB的电影,这个电影文件可能会被分割成很多个文件块(比如分成1000块,每块大约2MB)。等所有文件块都下载完成之后,再组装成一个完整的电影文件。

    具体的BT协议很复杂,校验方法也有很多,这里说其中一种思路。

    通过哈希算法,对1000个文件块分别取哈希值,并且保存在种子文件中。当文件块下载完成后,通过相同的哈希算法,对下载好的文件块逐一对比。如果不同,说明这个文件块不完成或者被篡改了,需要再生产从其他宿主机器上下载这个文件块。

     

    应用四:散列函数

    散列函数是哈希算法的一种应用,更加看重的是散列的平均性和哈希算法的执行效率。

    课后思考

    现在,区块链是一个很火的领域,它被很多人神秘化,不过其底层的实现原理并不复杂。其中,哈希算法就是它的一个非常重要的理论基础。你能讲一讲区块链使用的是哪种哈希算法吗?是为了解决什么问题而使用的呢?

    • SHA 256:产生一个256位哈希。这是目前比特币正在使用的。
    • Keccak-256:产生256位哈希,目前由Ethereum使用。
    • CryptoNight:Monero使用的哈希函数。

    保证每个区块是唯一标识的、不可逆、无冲突。

  • 相关阅读:
    通过命令行配置samba服务
    新版python logging 封装,支持同时向console,file,socket输出
    python多进程管理DEMO
    注意tornado中的日志操作
    一个简单的python日志服务器
    NoVNC的使用、websockify以及VNC截图
    Oracle——distinct的用法
    C# Excel数据转化为Datatable
    C# winform 无API函数实现系统快捷键
    [转]C# WInForm 无框窗体移动
  • 原文地址:https://www.cnblogs.com/liang24/p/13255152.html
Copyright © 2011-2022 走看看