Python利用模糊哈希實(shí)現(xiàn)對比文件相似度
對比兩個文件相似度,python中可通過difflib.SequenceMatcher/ssdeep/python_mmdt/tlsh實(shí)現(xiàn),在大量需要對比,且文件較大時,需要更高的效率,可以考慮模糊哈希(fuzzy hash),如ssdeep/python_mmdt
測試過程發(fā)現(xiàn):
- difflib方法,讀取文件后,可以實(shí)現(xiàn)匹配度輸出
- ssdeep/mmdt/tlsh方法可以實(shí)現(xiàn),實(shí)現(xiàn)提前模糊哈希值,驗(yàn)證時,只讀取一次,完成對比,從而優(yōu)化對比時間,及內(nèi)存/cpu消耗
- tlsh測試時,值越小,相似度越高,在對比小文件時,很不理想
- 在對比小文件時,三種方法相差不大,在對比大文件(案例中81MB),difflib方法慢的難以接受
- 在實(shí)際環(huán)境中,建議使用mmdt方法,因?yàn)閟sdeep在二進(jìn)制對比中差別較大,失去參考價值,具體還有哪些文件類型存在此問題有待考量,
測試環(huán)境:
OS:ubuntu20.04
python:3.8.10
py-tlsh==4.7.2
python-mmdt==0.3.1
ssdeep==3.4
# -*- coding: utf-8 -*-
import ssdeep
import time
from python_mmdt.mmdt.mmdt import MMDT
from difflib import SequenceMatcher
def difflib_test(file1,file2):
start_time = time.time()
with open(file1,'rb') as f:
s1 = f.read()
with open(file2,'rb') as f:
s2 = f.read()
match_obj = SequenceMatcher(None,s1,s2)
print("difflib match:",match_obj.ratio())
end_time = time.time()
print('difflib_test cost :',end_time-start_time)
def mmdt_test(file1,file2):
start_time = time.time()
mmdt=MMDT()
r1 = mmdt.mmdt_hash(file1)
print(r1)
r2 = mmdt.mmdt_hash_streaming(file2)
print(r2)
# sim1 = mmdt.mmdt_compare(file1, file2)
# print("mmdt match:",sim1)
sim2 = mmdt.mmdt_compare_hash(r1, r2)
print("mmdt match:",sim2)
end_time = time.time()
print('mmdt_test cost :',end_time-start_time)
def ssdeep_test(file1,file2):
start_time = time.time()
sig1=ssdeep.hash_from_file(file1)
sig2=ssdeep.hash_from_file(file2)
print(sig1)
print(sig2)
print("ssdeep match:",ssdeep.compare(sig1,sig2))
end_time = time.time()
print('ssdeep_test cost :',end_time-start_time)
if __name__ == '__main__':
start_time = time.time()
file1='/root/test/fstab'
file2='/root/test/fstab2'
# file1 = '/root/test/initrd.img-5.4.0-125-generic'
# file2 = '/root/test/initrd.img-5.4.0-135-generic'
mmdt_test(file1,file2)
ssdeep_test(file1,file2)
difflib_test(file1,file2)
end_time = time.time()
print('總執(zhí)行時間:',end_time-start_time)下面給出對比小文件/大文件效果:

測試tlsh
import tlsh
import time
def tlsh_test(file1,file2):
start_time = time.time()
with open(file1,'rb') as f:
s1 = tlsh.hash(f.read())
with open(file2,'rb') as f:
s2 = tlsh.hash(f.read())
match_obj = tlsh.diff(s1,s2)
print("tlsh match:",match_obj)
end_time = time.time()
print('difflib_test cost :',end_time-start_time)
if __name__ == '__main__':
start_time = time.time()
# file1='/root/test/fstab'
# file2='/root/test/fstab2'
file1 = '/root/test/initrd.img-5.4.0-125-generic'
file2 = '/root/test/initrd.img-5.4.0-135-generic'
tlsh_test(file1,file2)
end_time = time.time()
print('總執(zhí)行時間:',end_time-start_time)對比小文件/大文件

到此這篇關(guān)于Python利用模糊哈希實(shí)現(xiàn)對比文件相似度的文章就介紹到這了,更多相關(guān)Python對比文件相似度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python探針完成調(diào)用庫的數(shù)據(jù)提取
這篇文章主要介紹了Python探針完成調(diào)用庫的數(shù)據(jù)提取,Python中可以通過sys.meta_path來實(shí)現(xiàn)import?hook的功能,下文詳細(xì)資料介紹,需要的小伙伴可以參考一下2022-05-05
利用Python實(shí)現(xiàn)讀取Word文檔里的Excel附件
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)讀取Word文檔里的Excel附件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
基于python和flask實(shí)現(xiàn)http接口過程解析
這篇文章主要介紹了基于python和flask實(shí)現(xiàn)http接口過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
python merge、concat合并數(shù)據(jù)集的實(shí)例講解
下面小編就為大家分享一篇python merge、concat合并數(shù)據(jù)集的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python?PaddleGAN實(shí)現(xiàn)調(diào)整照片人物年齡
這篇文章主要介紹了通過PaddleGAN實(shí)現(xiàn)照片人物的老年化和年輕化處理,文中的示例代碼講解有效,對我們學(xué)習(xí)或工作有一定的幫助,感興趣的可以學(xué)習(xí)一下2021-12-12
將python代碼打包成.exe文件直接運(yùn)行的具體步驟
小編最近收到了一個小伙伴的問題,就是那么多有趣的代碼,怎么發(fā)給別人,讓沒有python環(huán)境的小伙伴也可以使用呢,本文小編將帶著大家探索如何將自己的python代碼打包成.exe可執(zhí)行文件,一起來看看吧2024-02-02
Python中的sorted函數(shù)應(yīng)用及文件操作詳解
這篇文章主要介紹了Python中的sorted函數(shù)應(yīng)用及文件操作詳解,python只能將字符串寫入到文本文件,要將數(shù)值數(shù)據(jù)存儲到文本本件中,必須先試用函數(shù)str()將其轉(zhuǎn)換為字符串格式,需要的朋友可以參考下2023-12-12

