背景

近来学习到python的内置函数hash(),深入发现通过python的哈希值可以做很多的事情,最典型的可能就是文件加密了,在我们现实生活中大约有如下一些用途:

  • 加密网站注册用户的密码。
  • 网站用户上传图片 / 文件后,计算出MD5值作为文件名。(MD5可以保证唯一性)
  • key-value数据库中使用MD5值作为key。
  • 比较两个文件是否相同。(大家在下载一些资源的时候,就会发现网站提供了MD5值,就是用来检测文件是否被篡改)
    本文就是通过python简单实现如何比较两个文件是否相等?

实现原理

散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
加密散列函数,是散列函数的一种。它被认为是一种单向函数,也就是说极其难以由散列函数输出的結果,回推输入的资料是什么。这样的单向函数被称为“现代密码学的驮马”。这种散列函数的输入资料,通常被称为讯息(message),而它的输出结果,经常被称为讯息摘要(message digest)或摘要(digest)。它的过程如下:

具体实现

MD5

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)。128位长度。目前MD5是一种不可逆算法。具有很高的安全性。它对应任何字符串都可以加密成一段唯一的固定长度的代码。

SHA1

SHA1的全称是Secure Hash Algorithm(安全哈希算法) 。SHA1基于MD5,加密后的数据长度更长,它对长度小于264的输入,产生长度为160bit的散列值。比MD5多32位。
因此,比MD5更加安全,但SHA1的运算速度就比MD5要慢了。

我们将演示使用MD5散列算法来hash文件。 我们不会一次性提取全部文件数据,因为一些文件非常大,会很消耗内存甚至一次性放不下。将文件分割成小块读取将使处理过程高效地使用内存。
在Python中内置的 hashlib 模块就包括了 md5 和 sha1 算法。而且使用起来也极为方便,我们使用md5算法来实现我们比较文件一致性的功能,我们会使用update()方法来对这个对象填充任意的字符串。在任何时候你都可以使用digest()或hexdigest()方法问它要目前为止填充的字符串的摘要。我们需要了解以下几个函数:

hash.update(arg)

用字符串arg更新哈希对象。重复的调用等同于单次调用所有参数的连接:m.update(a); m.update(b) 相当于m.update(a+b)。

hash.digest()

返回目前为止传递给update()方法的字符串的摘要。它是一个具有digest_size个字节的字符串,其中可能包含非ASCII 字符,包括空字节。

hash.hexdigest()

类似digest(),但是返回的摘要的字符串的长度翻倍,且只包含十六进制数字。这可用于在电子邮件或其它非二进制环境中安全交换数据。

代码

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Time: 17-11-29 下午10:26
# Author: sty
# File: compare_file.pyimport hashlibdef get_file_md5(f):m = hashlib.md5()while True:#如果不用二进制打开文件,则需要先编码#data = f.read(1024).encode('utf-8')data = f.read(1024)  #将文件分块读取if not data:breakm.update(data)return m.hexdigest()#将file2文件写入改动了一个位数的数据
txt1 = '你好么?我可以用下面这段代码验证一下:'
txt2 = '你好么?我可以用下面这段代码验证一下:1'
with open('1.txt', 'w', encoding='utf-8') as f1, open('2.txt', 'w', encoding='utf-8') as f2:f1.write(txt1)f2.write(txt2)with open('1.txt', 'rb') as f1, open('2.txt', 'rb') as f2:file1_md5 = get_file_md5(f1)file2_md5 = get_file_md5(f2)print('file1_md5:',file1_md5)print('file2_md5:',file2_md5)if file1_md5 != file2_md5:print('file has changed')else:print('file not changed')

在代码中,我们通过将两段字符串txt1,txt2来模拟文件的改动,分别写入1.txt,2.txt,然后我们将两个文件分别读取,计算它们的MD5值,通过比较MD5值便可以知道它们是否一致。
需要注意
1.是文件打开方式一定要是二进制方式,既打开文件时使用b模式,否则Hash计算是基于文本的那将得到错误的文件Hash,如果不用’rb’去读的话,而用’r’去读的话,我们读取的是uncode的编码,然后我们将读取到的内容编码成’utf-8’,即encode(‘utf-8’),然后进行MD5计算也是可以的。
2.为了避免读入的文件过大,我们是分块读取的。

参考资料:

http://www.cnblogs.com/thinkingfor/archive/2010/09/13/1824766.html
http://www.cnblogs.com/the4king/archive/2012/02/06/2340660.html
http://usyiyi.cn/documents/python_278/library/hashlib.html
https://www.wikiwand.com/zh/%E5%AF%86%E7%A2%BC%E9%9B%9C%E6%B9%8A%E5%87%BD%E6%95%B8

转载请注明出处:
CSDN:楼上小宇_home:http://blog.csdn.net/sty945
简书:楼上小宇:http://www.jianshu.com/u/1621b29625df

通过python利用哈希值实现比较两个文件的一致性相关推荐

  1. java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...

  2. python 利用 PIL 将数组值转成图片/python利用h5py、pyhdf读取.h5、.hdf文件信息

    python 利用 PIL 将数组值转成图片 安装 PIL 包 pip install pillow 将二维数据转换成单通道图片 from PIL import Image arr=numpy.asa ...

  3. python google翻译,python利用google翻译方法实例(翻译字幕文件)

    英文字幕确实让人头疼,因此,花了一天专门研究,用python实现了比较简单的翻译代码.仅有几十行 首先加载模块 pip uninstall googletrans git clone https:// ...

  4. 利用哈希map快速判断两个数组的交集

    在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题. 该题需要找出两个数组的交集,最简单的一个办法就是用A数组里面的所有数去匹配B数组里面的数.假设 ...

  5. Python利用马青公式计算圆周率Π并写入文件

    一.什么是马青公式         马青公式由英国天文学教授约翰·马青(John Machin ,1686 –1751)于1706年发现,他利用这个公式计算到了100位的圆周率. 马青公式每计算一项可 ...

  6. python利用flask搭建接口中转数据给DLL文件

    业务场景 现需要与某局做业务数据接口,但对方的接口只能读取DLL文件调用,而我们这边的系统是运行在Linux的,对方的DLL文件是在windows上编译的,所以需要用一台windows服务器做为中转, ...

  7. 利用svn对电脑上的两个文件的内容进行比对

    按住ctrl键选中要比对的两个文件,鼠标点击右键,选择[TortoiseSVN]→[Diff]就可以了 打开后显示两个文件的内容的不同的地方

  8. Python使用模糊哈希值比较文件相似度

    使用ssdeep工具来计算文件的模糊哈希值或分段哈希值,或者编写Python程序调用ssdeep提供的API函数来计算文件的模糊哈希值,模糊哈希值可以用来比较两个文件的相似百分比.这个工具在Windo ...

  9. Python批量修改图片,刷新哈希值

    为什么要修改图片的哈希值? 如何修改图片的哈希值? 为什么要修改图片的哈希值? 上传一个文件到网盘时,网盘会检查该文件的哈希值,如果与网盘服务器上储存的某个文件的哈希值相同,说明该文件已经被上传过了, ...

最新文章

  1. linux 磁盘查看sbli,Linux磁盘配额应用
  2. Python批量替换掉某些值为新的值
  3. python在编程序网站_Python的用户登录接口编制以及实现流程图
  4. hive指定hadoop执行队列
  5. 谷歌AI魔镜:看你手舞足蹈,就召唤出8万幅照片学你跳 | TensorFlow.js
  6. andorid actionBar
  7. android 代码植入,Android Studio之Debug运行期代码植入的方法
  8. mysql提权马免杀_webshell/牛逼免杀提权隐藏大马.asp at master · tennc/webshell · GitHub...
  9. Python 宽学网
  10. centos未能加载虚拟光盘 C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions
  11. 天线接口:SMA、TNC 有什么差别?
  12. 数据执行保护呈灰色无法开启 用命令BCEDIT无效 请问怎么解决?
  13. VRay Next for SketchUp 泳池水材质制作教程
  14. [Nucleo-F411RE] 第1篇---新建一个工程
  15. 数字通信系统和模拟通信系统的简单介绍
  16. 使用Drozer对Android四大组件进行测试
  17. Arthas(阿尔萨斯)
  18. Debian10搭建Samba文件共享服务器
  19. NICE DCV用户案例:大众汽车如何使用NICE DCV进行重型3D模型远程可视化
  20. 铁威马NAS中如何利用Docker安装人人影视教程

热门文章

  1. java操作跨页的word cell,“excle如何打印不出现断行“EXCEL中,如何不跨页断行打印或显示,谢谢...
  2. 难忘的一天——装操作系统(三)
  3. 正则语法完全正则表达式手册_语法格式重点
  4. LeetCode简单题之二叉搜索树中的众数
  5. CUDA 11功能清单
  6. nvGRAPH原理概述
  7. Linux crontab 命令基本说明
  8. SyntaxError: Non-ASCII character ‘\xe5‘ in file(xxlrt_1.py) on line 7, but no encoding declared;
  9. 微信小程序自定义组件Component的简单使用
  10. github READme 的使用教程