hashlib不仅可以对密码进行加密也可以对文件内容进行校验,传统的小文件校验通过人为校验是不现实的,如果摸个文件里面的内容多出一个空格的话那么哦是根本就不知道的因此我们需要一个可以校验文件的方法,而hashlib则可以帮我们实现传统的文件校验

如下我们先试下普通的文件内容校验

代码如下

def check_md5(file):
with open(file,mode="rb") as fp:
hs = hashlib.md5()
hs.update(fp.read())
return hs.hexdigest() res1 = check_md5("ceshi1.txt")
res2 = check_md5("ceshi2.txt")
print(res1,res2)

把两个文件的内容全部丢入hs.update(fp.read())这个对象的方法中

调用hs.hexdigesst的话我会产生一个随机的32位字符串

此时如果两个文件的内容的如果是一模一样的话那么它所产生的随机32位字符串也是一样的这是实现文件校验的基本模型

上面我介绍了小文件的校验,现在我们得考虑一问题,文件的读取都是一股脑的全部丢到内存中进行读取的,那么如果一个文件是特别巨大的呢那时如果一股脑全部丢到内存中的话会直接把内存给挤爆了间接造成了内存的益出

下面我介绍两种方法读一点内容覆盖一点内容

注我们需要明白的是文件不仅是一个可迭代对象,同时也是一个迭代器

那么既然文件是一个迭代器对的话我就可以限制每次到文件中去取一定数值大小的文件进行update连续更新此时不会造成内存的直接爆炸又可以间接的对文件的内容进行校验

代码如下

def check_md5(file):
hs = hashlib.md5()
with open(file,mode="rb") as fp:
while True:
# 最多读取5个字节
content = fp.read(5)
if content:#如果content有值的话我就执行,没有值的话我就执行#else
hs.update(content)
else:
break
return hs.hexdigest() print("<=======方法一=======>")
print(check_md5("ceshi1.txt"))
print(check_md5("ceshi2.txt"))

代码解析,我们要知道hashlib下的update是可以基于上一次的字符串大小更新完32位随机字符串之后继续累加更新的那么我每次从迭代器中取出一致大小的数据循环丢到update中进行持续的更新那么等我取完所有的文件之后所得到的的就是一个完整的32位随机字符串了与传统的文件读取所加密的随机字符串无区别

还有另外一个方法也可以循环的对文件的大小进行校验,重复累加之后所得到的字符创与上面是一致的

代码如下

def check_md5(file):
hs = hashlib.md5()
filesize = os.path.getsize(file)
print(filesize)
with open(file,mode="rb") as fp:
while filesize:
content = fp.read(10)
hs.update(content)
filesize -= len(content)
return hs.hexdigest() print("<=======方法二=======>")
print(check_md5("ceshi1.txt"))
print(check_md5("ceshi2.txt"))

基于hashlib下的文件校验的更多相关文章

  1. ubuntu 下的文件校验(md5、sha256)

    在本地使用 md5sum/sha256sum 生成某待测文件的 hash 值,以跟标准文件的 hash 值做对比验证,确定经网络传输过程得到的文件是否真实无损.一般而言,hash 值如果一致,大概率上 ...

  2. $Django 模板层(模板导入,继承)、 单表*详(增删改查,基于双下划线的查询)、static之静态文件配置

    0在python脚本中使用django环境 import osif __name__ == '__main__':    os.environ.setdefault("DJANGO_SETT ...

  3. 使用hashlib进行文件校验

    import hashlib import os path = r'D:\CentOS 64 位' def file_md5(path): """ 文件校验 :param ...

  4. hashlib 文件校验,MD5动态加盐返回加密后字符

    hashlib 文件校验 # for循环校验 import hashlib def check_md5(file): ret = hashlib.md5() with open(file, mode= ...

  5. 手把手写一个基于Spring Boot框架下的参数校验组件(JSR-303)

    前言 之前参与的新开放平台研发的过程中,由于不同的接口需要对不同的入参进行校验,这就涉及到通用参数的校验封装,如果不进行封装,那么写出来的校验代码将会风格不统一.校验工具类不一致.维护风险高等其它因素 ...

  6. system32下 exe文件作用

    system32下EXE文件的作用说明 A accwiz.exe 辅助功能向导 ahui.exe 应用程序兼容用户界面 alg.exe 为 Internet 连接共享和 Internet 连接防火墙提 ...

  7. Hadoop IO 特性详解(2)【文件校验】

    (本文引用了microheart,ggjucheng的一些资料,在此感谢.charles觉得知识无价,开源共享无价) 这一次我们接着分析文件IO校验的相关代码,看看最底层是如何实现这种大数据集的文件校 ...

  8. Servlet3.0学习总结——基于Servlet3.0的文件上传

    Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileu ...

  9. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

    基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...

随机推荐

  1. 系统设计与分析:Alpha版本2成绩汇总

    作业要求 1.作业内容 作业具体要求以及评分标准 2.评分细则 •给出开头和团队成员列表(10’) •给出发布地址以及安装手册(20’) •给出测试报告(40’) •给出项目情况总结(30’)   * ...

  2. adb的常见命令和异常报错操作

    adb连接状态 adb devices , 获取设备列表及设备状态 设备的状态有 3 种 device , 设备连接正常 offline , 设备离线,连接出现异常 unauthorized 设备为进 ...

  3. 【bzoj4154】(dfs序+kd-tree)

    传送门 题意: 给出一颗以\(1\)为根的有根树,初始所有结点的颜色为\(1\). 之后有两个操作,一种是每次将距离\(a\)结点距离不超过\(l\)的所有儿子结点颜色染为\(c\):另一种是询问结点 ...

  4. (转)新建maven项目时报错Error:Maven Resources Compiler: Maven project configuration required for module 'XX'解决方法

    转载地址:https://blog.csdn.net/qq784515681/article/details/85070195 在新建maven项目时,Problems中报错: Error:Maven ...

  5. python27期jquery:

    JavaScript:(简称“JS”) 是一种轻量级的编程语言(ECMAscript5或6)是一种解释性脚本语言(代码不进行预编译)主要用来向HTML页面添加交互行为JavaScript 是互联网上最 ...

  6. jQuery核心(一)

    API文档:http://jquery.cuishifeng.cn/ 一. jQuery.extend(object) 用于扩展jQuery对象本身.用来在jQuery命名空间上增加新函数. jQue ...

  7. Java常识2

    JDK 的下载 安装 下载 官网 github安装 傻瓜式安装 JDK .JRE 注意问题 安装软件的 路径不能包含中文 空格 path环境变量 windows操作系统执行命令是所要搜寻的路径为什么要 ...

  8. goroutine使用

    Goroutine是建立在线程之上的轻量级的抽象.它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法.相比于线程,它的创建和销毁的代价要小很多,并且它的调度是独立于线程的.在gola ...

  9. Docker 简单发布dotnet core项目 文本版

    原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 照着步骤来基本没错 但是有几个要注意的地方: v ...

  10. ThreadPoolExecutor 线程池 简单解析

    jdk1.8 ThreadPoolExecutor ThreadPoolExecutor实际就是java的线程池,开发常用的Executors.newxxxxx()来创建不同类型和作用的线程池,其底部 ...