나는 파이썬이 EOF를 읽기를 원하므로 sha1이든 md5이든 적절한 해시를 얻을 수 있습니다. 도와주세요. 지금까지 내가 가진 것은 다음과 같습니다.
import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
답변
TL; DR은 버퍼를 사용하여 메모리를 많이 사용하지 않습니다.
우리는 매우 큰 파일 작업의 메모리 의미를 고려할 때 문제의 핵심에 도달 합니다 . 우리는이 나쁜 소년이 2 기가 바이트 파일을 위해 2 기가 바이트의 램을 뒤 흔드는 것을 원하지 않습니다. 그래서 pasztorpisti가 지적했듯이 우리는 그 더 큰 파일을 덩어리로 처리해야합니다!
import sys
import hashlib
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
md5 = hashlib.md5()
sha1 = hashlib.sha1()
with open(sys.argv[1], 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
md5.update(data)
sha1.update(data)
print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))
우리가 한 것은 hashlib의 편리한 멋쟁이 업데이트 방법 과 함께 진행하면서이 나쁜 소년의 해시를 64kb 청크로 업데이트하는 것 입니다. 이런 식으로 우리는 한 번에 해시하는 데 걸리는 2GB보다 훨씬 적은 메모리를 사용합니다!
다음과 같이 테스트 할 수 있습니다.
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
도움이 되었기를 바랍니다.
또한이 모든 내용은 오른쪽의 링크 된 질문에 설명되어 있습니다. Python에서 큰 파일의 MD5 해시 가져 오기
추가!
일반적으로 파이썬을 작성할 때 pep-8 을 따르는 습관을들이는 것이 도움이됩니다 . 예를 들어, 파이썬에서 변수는 일반적으로 camelCased가 아닌 밑줄로 구분됩니다. 그러나 그것은 단지 스타일 일 뿐이고 나쁜 스타일을 읽어야하는 사람들을 제외하고는 아무도 그런 것들을 신경 쓰지 않습니다.
답변
파일의 해시 값을 정확하고 효율적으로 계산하려면 (Python 3에서) :
- 이진 모드 (즉, 파일 모드에 추가)에서 파일을 열어
'b'
문자 인코딩 및 줄 끝 변환 문제를 방지합니다. - 메모리 낭비이기 때문에 전체 파일을 메모리로 읽지 마십시오. 대신 블록별로 순차적으로 읽고 각 블록의 해시를 업데이트하십시오.
- 이중 버퍼링을 제거합니다. 즉, 이미 최적의 블록 크기를 사용하고 있으므로 버퍼링 된 IO를 사용하지 마십시오.
readinto()
버퍼 변동을 방지하는 데 사용 합니다.
예:
import hashlib
def sha256sum(filename):
h = hashlib.sha256()
b = bytearray(128*1024)
mv = memoryview(b)
with open(filename, 'rb', buffering=0) as f:
for n in iter(lambda : f.readinto(mv), 0):
h.update(mv[:n])
return h.hexdigest()
답변
나는 간단히 제안 할 것이다 :
def get_digest(file_path):
h = hashlib.sha256()
with open(file_path, 'rb') as file:
while True:
# Reading is buffered, so we can read smaller chunks.
chunk = file.read(h.block_size)
if not chunk:
break
h.update(chunk)
return h.hexdigest()
여기에있는 다른 모든 답변은 너무 복잡해 보입니다. 파이썬은 읽을 때 이미 버퍼링 중입니다 (이상적인 방식으로 또는 기본 저장소에 대한 더 많은 정보가있는 경우 해당 버퍼링을 구성합니다). 따라서 해시 함수가 이상적인 것을 찾는 청크 단위로 읽는 것이 좋습니다. 해시 함수를 계산합니다. 따라서 버퍼링을 비활성화하고 직접 에뮬레이션하는 대신 Python 버퍼링을 사용하고 제어해야하는 항목, 즉 데이터 소비자가 이상적인 해시 블록 크기를 찾는 항목을 제어합니다.
답변
다른 알고리즘으로 큰 파일을 해시 할 수있는 모듈을 프로그래밍했습니다.
pip3 install py_essentials
다음과 같이 모듈을 사용하십시오.
from py_essentials import hashing as hs
hash = hs.fileChecksum("path/to/the/file.txt", "sha256")
답변
다음은 mmap
객체를 메모리에 매핑 하는 데 사용하는 Python 3, POSIX 솔루션 (Windows가 아닙니다!)입니다 .
import hashlib
import mmap
def sha256sum(filename):
h = hashlib.sha256()
with open(filename, 'rb') as f:
with mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ) as mm:
h.update(mm)
return h.hexdigest()
답변
import hashlib
user = input("Enter ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
with open("encrypted.txt","w") as e:
print(h2,file=e)
with open("encrypted.txt","r") as e:
p = e.readline().strip()
print(p)
답변
