[python] Python에서 파일 해싱

나는 파이썬이 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)


답변