파이썬에서 파일의 MD5 체크섬을 어떻게 계산합니까?
파일에서 MD5 해시를 확인하고 원본 해시와 일치하는지 확인하는 코드를 파이썬으로 작성했습니다.
제가 개발한 것은 다음과 같습니다.
# Defines filename
filename = "file.exe"
# Gets MD5 from file
def getmd5(filename):
return m.hexdigest()
md5 = dict()
for fname in filename:
md5[fname] = getmd5(fname)
# If statement for alerting the user whether the checksum passed or failed
if md5 == '>md5 will go here<':
print("MD5 Checksum passed. You may now close this window")
input ("press enter")
else:
print("MD5 Checksum failed. Incorrect MD5 in file 'filename'. Please download a new copy")
input("press enter")
exit
그러나 코드를 실행할 때마다 다음 오류가 발생합니다.
Traceback (most recent call last):
File "C:\Users\Username\md5check.py", line 13, in <module>
md5[fname] = getmd5(fname)
File "C:\Users\Username\md5check.py, line 9, in getmd5
return m.hexdigest()
NameError: global name 'm' is not defined
제 코드에 제가 빠진 것이 있나요?
당신의 오류와 당신의 코드에 무엇이 누락되었는지에 관해서요. m
에 대해 정의되지 않은 이름입니다.getmd5()
기능.
무례하게 굴지 마세요, 초보자인 건 알지만 코드가 여기저기 널려 있어요.당신의 이슈를 하나씩 살펴봅시다 :)
첫째, 당신은 사용하지 않습니다.hashlib.md5.hexdigest()
올바른 방법입니다.Python Doc Library의 hashlib 함수에 대한 설명을 참조하십시오.제공된 문자열에 대해 MD5를 반환하는 올바른 방법은 다음과 같은 작업을 수행하는 것입니다.
>>> import hashlib
>>> hashlib.md5("example string").hexdigest()
'2a53375ff139d9837e93a38a279d63e5'
하지만, 당신은 여기서 더 큰 문제를 안고 있습니다.파일 이름 문자열에서 MD5를 계산하는 경우 실제로는 파일 내용을 기준으로 MD5가 계산됩니다.기본적으로 파일 내용을 읽고 MD5를 통해 파이프를 연결해야 합니다. 다음 예는 효율적이지 않지만 다음과 같은 것입니다.
>>> import hashlib
>>> hashlib.md5(open('filename.exe','rb').read()).hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'
보시다시피 두 번째 MD5 해시는 첫 번째 해시와 완전히 다릅니다.그 이유는 우리가 파일 이름뿐만 아니라 파일 내용을 밀어넣고 있기 때문입니다.
간단한 솔루션은 다음과 같은 것이 될 수 있습니다.
# Import hashlib library (md5 method is part of it)
import hashlib
# File to check
file_name = 'filename.exe'
# Correct original md5 goes here
original_md5 = '5d41402abc4b2a76b9719d911017c592'
# Open,close, read file and calculate MD5 on its contents
with open(file_name, 'rb') as file_to_check:
# read contents of the file
data = file_to_check.read()
# pipe contents of the file through
md5_returned = hashlib.md5(data).hexdigest()
# Finally compare original MD5 with freshly calculated
if original_md5 == md5_returned:
print "MD5 verified."
else:
print "MD5 verification failed!."
Python: 파일의 MD5 체크섬 생성 게시물을 보십시오.효율적으로 달성할 수 있는 몇 가지 방법을 자세히 설명합니다.
행운을 빌어요.
import hashlib
with open("your_filename.png", "rb") as f:
file_hash = hashlib.md5()
while chunk := f.read(8192):
file_hash.update(chunk)
print(file_hash.digest())
print(file_hash.hexdigest()) # to get a printable str instead of bytes
Python 3.7 이하 버전:
with open("your_filename.png", "rb") as f:
file_hash = hashlib.md5()
chunk = f.read(8192)
while chunk:
file_hash.update(chunk)
chunk = f.read(8192)
print(file_hash.hexdigest())
이렇게 하면 한 번에 파일 8192(또는 2µ³) 바이트를 읽을 수 있습니다.f.read()
더 적은 메모리를 사용합니다.
대신 을 사용하는 것을 고려합니다.md5
(그냥 교체)md5
와 함께blake2b
위의 스니펫에서).MD5보다 암호화된 보안 기능과 속도가 빠릅니다.
hashlib
메소드:지원도mmap
모듈, 그래서 자주 사용합니다.
from hashlib import md5
from mmap import mmap, ACCESS_READ
path = ...
with open(path) as file, mmap(file.fileno(), 0, access=ACCESS_READ) as file:
print(md5(file).hexdigest())
어디에path
파일의 경로입니다.
참조: https://docs.python.org/library/mmap.html#mmap.mmap
편집: 일반 읽기 방법과 비교합니다.
from hashlib import md5
from mmap import ACCESS_READ, mmap
from matplotlib.pyplot import grid, legend, plot, show, tight_layout, xlabel, ylabel
from memory_profiler import memory_usage
from numpy import arange
def MemoryMap():
with open(path) as file, mmap(file.fileno(), 0, access=ACCESS_READ) as file:
print(md5(file).hexdigest())
def PlainRead():
with open(path, 'rb') as file:
print(md5(file.read()).hexdigest())
if __name__ == '__main__':
path = ...
y = memory_usage(MemoryMap, interval=0.01)
plot(arange(len(y)) / 100, y, label='mmap')
y = memory_usage(PlainRead, interval=0.01)
plot(arange(len(y)) / 100, y, label='read')
ylabel('Memory Usage (MiB)')
xlabel('Time (s)')
legend()
grid()
tight_layout()
show()
path
는 3.77GiB CSV 파일의 경로입니다.
할 수 .hashlib.md5().hexdigest()
이를 위한 기능은 다음과 같습니다.
def File_Checksum_Dis(dirname):
if not os.path.exists(dirname):
print(dirname+" directory is not existing");
for fname in os.listdir(dirname):
if not fname.endswith('~'):
fnaav = os.path.join(dirname, fname);
fd = open(fnaav, 'rb');
data = fd.read();
fd.close();
print("-"*70);
print("File Name is: ",fname);
print(hashlib.md5(data).hexdigest())
print("-"*70);
언급URL : https://stackoverflow.com/questions/16874598/how-do-i-calculate-the-md5-checksum-of-a-file-in-python
'source' 카테고리의 다른 글
Oracle 날짜가 주말인지 확인하시겠습니까? (0) | 2023.07.16 |
---|---|
Panda를 사용하여 기존 엑셀 파일에 새 시트를 저장하는 방법은 무엇입니까? (0) | 2023.07.16 |
조건이 있는 Mongodb 집계 조회 (0) | 2023.07.16 |
Oracle에서 행을 열로 변환하는 방법 (0) | 2023.07.16 |
스프링 부트 JAR의 BOOT-INF 및 META-INF 디렉토리는 무엇입니까? (0) | 2023.07.06 |