日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時間:2023/11/28 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过python利用哈希值实现比较两个文件的一致性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

近來學(xué)習(xí)到python的內(nèi)置函數(shù)hash(),深入發(fā)現(xiàn)通過python的哈希值可以做很多的事情,最典型的可能就是文件加密了,在我們現(xiàn)實(shí)生活中大約有如下一些用途:

  • 加密網(wǎng)站注冊用戶的密碼。
  • 網(wǎng)站用戶上傳圖片 / 文件后,計(jì)算出MD5值作為文件名。(MD5可以保證唯一性)
  • key-value數(shù)據(jù)庫中使用MD5值作為key。
  • 比較兩個文件是否相同。(大家在下載一些資源的時候,就會發(fā)現(xiàn)網(wǎng)站提供了MD5值,就是用來檢測文件是否被篡改)
    本文就是通過python簡單實(shí)現(xiàn)如何比較兩個文件是否相等?

實(shí)現(xiàn)原理

散列函數(shù)(或散列算法,又稱哈希函數(shù),英語:Hash Function)是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個叫做散列值(hash values,hash codes,hash sums,或hashes)的指紋。散列值通常用一個短的隨機(jī)字母和數(shù)字組成的字符串來代表。好的散列函數(shù)在輸入域中很少出現(xiàn)散列沖突。在散列表和數(shù)據(jù)處理中,不抑制沖突來區(qū)別數(shù)據(jù),會使得數(shù)據(jù)庫記錄更難找到。
加密散列函數(shù),是散列函數(shù)的一種。它被認(rèn)為是一種單向函數(shù),也就是說極其難以由散列函數(shù)輸出的結(jié)果,回推輸入的資料是什么。這樣的單向函數(shù)被稱為“現(xiàn)代密碼學(xué)的馱馬”。這種散列函數(shù)的輸入資料,通常被稱為訊息(message),而它的輸出結(jié)果,經(jīng)常被稱為訊息摘要(message digest)或摘要(digest)。它的過程如下:

具體實(shí)現(xiàn)

MD5

MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法)。128位長度。目前MD5是一種不可逆算法。具有很高的安全性。它對應(yīng)任何字符串都可以加密成一段唯一的固定長度的代碼。

SHA1

SHA1的全稱是Secure Hash Algorithm(安全哈希算法) 。SHA1基于MD5,加密后的數(shù)據(jù)長度更長,它對長度小于264的輸入,產(chǎn)生長度為160bit的散列值。比MD5多32位。
因此,比MD5更加安全,但SHA1的運(yùn)算速度就比MD5要慢了。

我們將演示使用MD5散列算法來hash文件。 我們不會一次性提取全部文件數(shù)據(jù),因?yàn)橐恍┪募浅4?#xff0c;會很消耗內(nèi)存甚至一次性放不下。將文件分割成小塊讀取將使處理過程高效地使用內(nèi)存。
在Python中內(nèi)置的 hashlib 模塊就包括了 md5 和 sha1 算法。而且使用起來也極為方便,我們使用md5算法來實(shí)現(xiàn)我們比較文件一致性的功能,我們會使用update()方法來對這個對象填充任意的字符串。在任何時候你都可以使用digest()或hexdigest()方法問它要目前為止填充的字符串的摘要。我們需要了解以下幾個函數(shù):

hash.update(arg)

用字符串a(chǎn)rg更新哈希對象。重復(fù)的調(diào)用等同于單次調(diào)用所有參數(shù)的連接:m.update(a); m.update(b) 相當(dāng)于m.update(a+b)。

hash.digest()

返回目前為止傳遞給update()方法的字符串的摘要。它是一個具有digest_size個字節(jié)的字符串,其中可能包含非ASCII 字符,包括空字節(jié)。

hash.hexdigest()

類似digest(),但是返回的摘要的字符串的長度翻倍,且只包含十六進(jìn)制數(shù)字。這可用于在電子郵件或其它非二進(jìn)制環(huán)境中安全交換數(shù)據(jù)。

代碼

# !/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:#如果不用二進(jìn)制打開文件,則需要先編碼#data = f.read(1024).encode('utf-8')data = f.read(1024)  #將文件分塊讀取if not data:breakm.update(data)return m.hexdigest()#將file2文件寫入改動了一個位數(shù)的數(shù)據(jù)
txt1 = '你好么?我可以用下面這段代碼驗(yàn)證一下:'
txt2 = '你好么?我可以用下面這段代碼驗(yàn)證一下: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,然后我們將兩個文件分別讀取,計(jì)算它們的MD5值,通過比較MD5值便可以知道它們是否一致。
需要注意
1.是文件打開方式一定要是二進(jìn)制方式,既打開文件時使用b模式,否則Hash計(jì)算是基于文本的那將得到錯誤的文件Hash,如果不用’rb’去讀的話,而用’r’去讀的話,我們讀取的是uncode的編碼,然后我們將讀取到的內(nèi)容編碼成’utf-8’,即encode(‘utf-8’),然后進(jìn)行MD5計(jì)算也是可以的。
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

轉(zhuǎn)載請注明出處:
CSDN:樓上小宇_home:http://blog.csdn.net/sty945
簡書:樓上小宇:http://www.jianshu.com/u/1621b29625df

總結(jié)

以上是生活随笔為你收集整理的通过python利用哈希值实现比较两个文件的一致性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。