30 lines
902 B
Python
30 lines
902 B
Python
|
"""Utilities to efficiently compute the SHA 256 hash of a bunch of bytes."""
|
||
|
|
||
|
from typing import BinaryIO, Optional
|
||
|
|
||
|
from .insecure_hashlib import sha256
|
||
|
|
||
|
|
||
|
def sha_fileobj(fileobj: BinaryIO, chunk_size: Optional[int] = None) -> bytes:
|
||
|
"""
|
||
|
Computes the sha256 hash of the given file object, by chunks of size `chunk_size`.
|
||
|
|
||
|
Args:
|
||
|
fileobj (file-like object):
|
||
|
The File object to compute sha256 for, typically obtained with `open(path, "rb")`
|
||
|
chunk_size (`int`, *optional*):
|
||
|
The number of bytes to read from `fileobj` at once, defaults to 1MB.
|
||
|
|
||
|
Returns:
|
||
|
`bytes`: `fileobj`'s sha256 hash as bytes
|
||
|
"""
|
||
|
chunk_size = chunk_size if chunk_size is not None else 1024 * 1024
|
||
|
|
||
|
sha = sha256()
|
||
|
while True:
|
||
|
chunk = fileobj.read(chunk_size)
|
||
|
sha.update(chunk)
|
||
|
if not chunk:
|
||
|
break
|
||
|
return sha.digest()
|