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
|
|
|
|
|
|
|
|
2024-01-03 17:33:36 +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()
|