mirror of
https://github.com/bellingcat/auto-archiver-api.git
synced 2026-06-08 03:28:35 +03:00
15 lines
558 B
Python
15 lines
558 B
Python
def fnv1a_hash_mod(s: str, modulo: int) -> int:
|
|
# receives a string and returns a number in [0:modulo-1], ensures an even
|
|
# distribution over the modulo range
|
|
offset_basis_hash = 0x811C9DC5 # FNV offset basis
|
|
fnv_prime = 0x01000193 # FNV prime
|
|
for char in s:
|
|
offset_basis_hash ^= ord(char)
|
|
offset_basis_hash *= fnv_prime
|
|
offset_basis_hash &= 0xFFFFFFFF # Keep it 32-bit
|
|
return (
|
|
offset_basis_hash
|
|
if offset_basis_hash < 0x80000000
|
|
else offset_basis_hash - 0x100000000
|
|
) % modulo
|