꽤 비효율적 인 방법이 있습니다.
하나의 파일:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
파일 목록 :
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
그러나 MD5는 고장난 것으로 알려져 있으며 취약성 분석이 실제로 까다로울 수 있기 때문에 어떤 목적으로도 사용해서는 안된다는 점을 기억 하십시오. 향후 발생할 수있는 사용을 분석하는 것은 보안 문제로 인해 불가능할 수 있습니다. IMHO, 라이브러리에서 평평하게 제거해야 라이브러리를 사용하는 모든 사람이 강제로 업데이트됩니다. 따라서 대신 수행해야 할 작업은 다음과 같습니다.
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
128 비트의 다이제스트 만 원한다면 할 수 있습니다 .digest()[:16]
.
그러면 파일 이름과 해시가 들어있는 튜플 목록이 나타납니다.
다시 한 번 MD5 사용에 의문을 제기합니다. 최소한 SHA1을 사용해야 하고 SHA1 에서 발견 된 최근 결함이 있을 수 있습니다. 어떤 사람들은 MD5를 '암호화'목적으로 사용하지 않는 한 괜찮다고 생각합니다. 그러나 물건은 처음에 예상했던 것보다 범위가 넓어지는 경향이 있으며 일시적인 취약점 분석에 완전히 결함이있을 수 있습니다. 게이트에서 올바른 알고리즘을 사용하는 습관을들이는 것이 가장 좋습니다. 그냥 다른 문자를 입력하는 것입니다. 그렇게 어렵지 않습니다.
더 복잡하지만 메모리 효율적인 방법은 다음과 같습니다 .
import hashlib
def hash_bytestr_iter(bytesiter, hasher, ashexstr=False):
for block in bytesiter:
hasher.update(block)
return hasher.hexdigest() if ashexstr else hasher.digest()
def file_as_blockiter(afile, blocksize=65536):
with afile:
block = afile.read(blocksize)
while len(block) > 0:
yield block
block = afile.read(blocksize)
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.md5()))
for fname in fnamelst]
그리고 다시, MD5가 손상되어 더 이상 사용해서는 안됩니다.
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
다시 말하지만 128 비트의 다이제스트 만 원한다면 [:16]
호출 후에 넣을 수 있습니다 hash_bytestr_iter(...)
.
md5sum
않습니까?