Saya ingin python membaca ke EOF sehingga saya bisa mendapatkan hash yang sesuai, apakah itu sha1 atau md5. Tolong bantu. Inilah yang saya miliki sejauh ini:
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
file.read()
dilakukannya - baca seluruh file.read()
metode tersebut mengatakan?Jawaban:
TL; DR menggunakan buffer untuk tidak menggunakan banyak memori.
Kami sampai ke inti masalah Anda, saya yakin, ketika kami mempertimbangkan implikasi memori dari bekerja dengan file yang sangat besar . Kami tidak ingin bocah nakal ini mengaduk-aduk 2 giga ram untuk file 2 gigabyte jadi, seperti yang ditunjukkan pasztorpisti , kami harus menangani file-file yang lebih besar itu dalam potongan!
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()))
Apa yang telah kami lakukan adalah memperbarui hash kami dari bocah nakal ini dalam potongan 64kb saat kami mengikuti metode pembaruan keren yang berguna dari hashlib . Dengan cara ini kami menggunakan memori yang jauh lebih sedikit daripada 2gb yang diperlukan untuk melakukan hash sekaligus!
Anda dapat mengujinya dengan:
$ mkfile 2g bigfile $ python hashes.py bigfile MD5: a981130cf2b7e09f4686dc273cf7187e SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d $ md5 bigfile MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e $ shasum bigfile 91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Semoga membantu!
Juga semua ini diuraikan dalam pertanyaan terkait di sisi kanan: Dapatkan hash MD5 file besar dengan Python
Tambahan!
Secara umum saat menulis python, ada baiknya membiasakan diri mengikuti pep-8 . Misalnya, dalam variabel python biasanya dipisahkan garis bawah, bukan camelCased. Tapi itu hanya gaya dan tidak ada yang benar-benar peduli tentang hal-hal itu kecuali orang yang harus membaca gaya yang buruk ... yang mungkin Anda membaca kode ini bertahun-tahun dari sekarang.
sumber
BUF_SIZE
?shasum
binari. Jawaban lain yang tercantum di bawah ini (yang menggunakan memoryview) kompatibel dengan alat hashing lainnya.Untuk penghitungan nilai hash file yang benar dan efisien (dengan Python 3):
'b'
ke kode file) untuk menghindari pengkodean karakter dan masalah konversi akhir baris.readinto()
untuk menghindari buffer yang berputar.Contoh:
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()
sumber
resource.getpagesize
ada gunanya di sini, jika kita ingin mencoba mengoptimalkannya secara dinamis? Dan bagaimana denganmmap
?Saya akan mengusulkan secara sederhana:
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()
Semua jawaban lain di sini tampaknya terlalu rumit. Python sudah buffering saat membaca (dengan cara yang ideal, atau Anda mengonfigurasi buffering itu jika Anda memiliki lebih banyak informasi tentang penyimpanan yang mendasarinya) dan oleh karena itu lebih baik untuk membaca dalam potongan-potongan yang menurut fungsi hash ideal yang membuatnya lebih cepat atau paling tidak CPU intensif untuk menghitung fungsi hash. Jadi, alih-alih menonaktifkan buffering dan mencoba menirunya sendiri, Anda menggunakan buffering Python dan mengontrol apa yang harus Anda kendalikan: apa yang dianggap ideal oleh konsumen data Anda, ukuran blok hash.
sumber
hash.block_size
didokumentasikan sebagai 'ukuran blok internal dari algoritma hash'. Hashlib tidak menganggapnya ideal . Tidak ada dalam dokumentasi paket yang menyarankan bahwaupdate()
lebih memilihhash.block_size
input berukuran. Itu tidak menggunakan lebih sedikit CPU jika Anda menyebutnya seperti itu.file.read()
Panggilan Anda mengarah ke banyak pembuatan objek yang tidak perlu dan salinan yang berlebihan dari buffer file ke objek chunk bytes baru Anda.block_size
. Jika Anda tidak menyediakannya dalam potongan tersebut, mereka harus menyangga dan menunggu data yang cukup untuk muncul, atau membagi data yang diberikan menjadi beberapa potongan secara internal. Jadi, Anda bisa mengatasinya di luar dan kemudian menyederhanakan apa yang terjadi secara internal. Saya menemukan yang ideal ini. Lihat contoh: stackoverflow.com/a/51335622/252025block_size
jauh lebih kecil daripada ukuran baca yang berguna. Selain itu, setiap blok yang berguna dan ukuran baca adalah pangkat dua. Dengan demikian, ukuran pembacaan dapat dibagi oleh ukuran blok untuk semua pembacaan kecuali mungkin pembacaan yang terakhir. Misalnya, ukuran blok sha256 adalah 64 byte. Itu berartiupdate()
dapat langsung memproses input tanpa ada buffering hingga kelipatanblock_size
. Jadi, hanya jika pembacaan terakhir tidak dapat dibagi oleh ukuran blok, ia harus menyangga hingga 63 byte, sekali. Karenanya, komentar terakhir Anda salah dan tidak mendukung klaim yang Anda buat dalam jawaban Anda.Saya telah memprogram modul yang dapat melakukan hash file besar dengan algoritme berbeda.
Gunakan modul seperti ini:
from py_essentials import hashing as hs hash = hs.fileChecksum("path/to/the/file.txt", "sha256")
sumber
Berikut adalah Python 3, solusi POSIX (bukan Windows!) Yang digunakan
mmap
untuk memetakan objek ke dalam memori.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()
sumber
mmap
skenario ini?bytes
objek dalam memori, dan memanggilread
terlalu banyak atau terlalu sedikit waktu. Ini akan memetakan file langsung ke memori virtual, dan melakukan hash dari sana - sistem operasi dapat memetakan konten file langsung dari cache buffer ke dalam proses membaca. Ini berarti ini bisa lebih cepat dengan faktor signifikan di atas yang satu iniimport 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)
sumber
echo $USER_INPUT | md5sum > encrypted.txt && cat encrypted.txt
yang tidak berhubungan dengan hashing file, terutama yang tidak besar.