chkbit-py/chkbit/hashfile.py

35 lines
779 B
Python
Raw Normal View History

2019-09-23 20:39:30 +00:00
import hashlib
2024-01-12 21:33:59 +00:00
from blake3 import blake3
2023-12-21 18:29:27 +00:00
from typing import Callable
2019-09-23 20:39:30 +00:00
2022-05-05 15:11:11 +00:00
BLOCKSIZE = 2**10 * 128 # kb
2019-09-23 20:39:30 +00:00
2023-12-21 18:29:27 +00:00
def hashfile(path: str, hash_algo: str, *, hit: Callable[[str], None]):
if hash_algo == "md5":
2022-02-20 18:11:29 +00:00
h = hashlib.md5()
elif hash_algo == "sha512":
h = hashlib.sha512()
2023-12-19 23:09:50 +00:00
elif hash_algo == "blake3":
h = blake3()
2022-02-20 18:11:29 +00:00
else:
2023-12-21 18:29:27 +00:00
raise Exception(f"algo '{hash_algo}' is unknown.")
2022-02-20 18:11:29 +00:00
2019-09-23 20:39:30 +00:00
with open(path, "rb") as f:
while True:
buf = f.read(BLOCKSIZE)
2023-12-21 18:29:27 +00:00
l = len(buf)
if l <= 0:
2019-09-23 20:39:30 +00:00
break
2022-02-20 18:11:29 +00:00
h.update(buf)
2023-12-21 18:29:27 +00:00
if hit:
hit(l)
2022-02-20 18:11:29 +00:00
return h.hexdigest()
2019-09-23 20:39:30 +00:00
def hashtext(text: str):
2019-09-23 20:39:30 +00:00
md5 = hashlib.md5()
md5.update(text.encode("utf-8"))
return md5.hexdigest()