zoukankan      html  css  js  c++  java
  • 哈希算法(应用场景)

    1.哈希算法介绍

    将任意长度的二进制值串映射为固定长度的二进制值串,该映射的规则就是哈希算法。

    2.哈希算法满足条件

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

    3.哈希算法应用场景

    3.1.安全加密

        最常用的加密的哈希算法是MD5(MD5消息摘要算法)和SHA(安全散列算法)。对于加密来说,两个方面比较重要:
        1.很难根据哈希值反向推到出原始数据(加密的目的就是防止原始数据泄露)
        2.尽量减少碰撞冲突概率(理论上没有办法做到完全不冲突)。这里可以了解鸽巢原理,假如有10个鸽巢,却有11只鸽子。
    
        在实际项目中,为了更加保障数据安全,使用原始数据+盐(salt)方式,一起计算哈希值的方式

    3.2.唯一标识

        如果要在海量图库中,搜索某张图片是否存在。是否可以直接通过图片的元信息(比如图片名称)进行比对?
        答案是:不能。因为可能存在名称相同,但是图片内容不同;或者名称不同,但是图片内容相同的情况。
        那么该如何实现搜索呢?
        
        答案:获取图片的二进制信息(二进制码串开头取100个字节+中间取100个字节+最后取100个字节),将拼接在一起的300个字节通过哈希算法,得到哈希值。作为图片的唯一标识即可。

    3.3.数据校验

        电驴这样的 BT 下载软件我们都有用过。我们知道,BT 下载的原理是基于 P2P 协议的。我们从多个机器上并行下载一个 2GB 的电影,这个电影文件可能会被分割成很多文件块(比如可以分成 100 块,每块大约 20MB)。等所有的文件块都下载完成之后,再组装成一个完整的电影文件就行了。
        我们知道,网络传输是不安全的,下载的文件块有可能是被宿主机器恶意修改过的,又或者下载过程中出现了错误,所以下载的文件块可能不是完整的。如果我们没有能力检测这种恶意修改或者文件下载出错,就会导致最终合并后的电影无法观看,甚至导致电脑中毒。
        现在的问题是,如何来校验文件块的安全、正确、完整呢?
        我们通过哈希算法,对 100 个文件块分别取哈希值,并且保存在种子文件中。哈希算法有一个特点,对数据很敏感。只要文件块的内容有一丁点儿的改变,最后计算出的哈希值就会完全不同。
        所以,当文件块下载完成之后,我们可以通过相同的哈希算法,对下载好的文件块逐一求哈希值,然后跟种子文件中保存的哈希值比对。如果不同,说明这个文件块不完整或者被篡改了,需要再重新从其他宿主机器上下载这个文件块。
  • 相关阅读:
    django之表设计、路由层等
    django之三剑客、静态文件配置、请求响应对象、数据库操作
    djang小项目过程中的小问题 02(跳转界面)
    生鲜超市项目错误及解决办法(crispy_forms、外键指向自己、class嵌套访问父类、meta类及各种字段参数)
    生鲜超市项目错误及解决办法(安装mysqlclient)
    djang小项目过程中的小问题 01(django中的configrarion配置、django自带命名规范)
    react-Hook
    react中登录注册 使用验证码验证
    react状态管理器之mobx
    react中的虚拟DOM,jsx,diff算法。让代码更高效
  • 原文地址:https://www.cnblogs.com/itall/p/11220620.html
Copyright © 2011-2022 走看看