rohitg00/ai-engineering-from-scratch · error · ValueError
num_hashes must be positive
Error message
num_hashes must be positive
What it means
Error "num_hashes must be positive" thrown in rohitg00/ai-engineering-from-scratch.
Source
Thrown at phases/19-capstone-projects/42-large-corpus-downloader/code/main.py:124
"""Derive two 64-bit coefficients (a, b) from a seed.
The signature uses universal hashing of the form ((a * x + b) mod p) mod 2^64.
Two coefficients are derived deterministically from the seed so the family
of hash functions is reproducible across runs and machines.
"""
digest = hashlib.blake2b(seed.to_bytes(8, "little"), digest_size=16).digest()
a = int.from_bytes(digest[:8], "little") | 1 # ensure a is non-zero
b = int.from_bytes(digest[8:], "little")
return a, b
class MinHasher:
"""MinHash signature builder with a fixed family of hash seeds."""
def __init__(self, num_hashes: int = DEFAULT_NUM_HASHES, shingle_width: int = DEFAULT_SHINGLE_WIDTH) -> None:
if num_hashes <= 0:
raise ValueError("num_hashes must be positive")
if shingle_width <= 0:
raise ValueError("shingle_width must be positive")
self.num_hashes = num_hashes
self.shingle_width = shingle_width
self._coefficients: list[tuple[int, int]] = [_hash_seed_pair(i) for i in range(num_hashes)]
def shingles(self, text: str) -> list[str]:
"""Return overlapping whitespace-token shingles."""
tokens = text.split()
if len(tokens) < self.shingle_width:
return [" ".join(tokens)] if tokens else []
shingles: list[str] = []
for start in range(len(tokens) - self.shingle_width + 1):
shingles.append(" ".join(tokens[start : start + self.shingle_width]))
return shingles
@staticmethodView on GitHub (pinned to 39ea8a1c6d)
When it happens
Trigger: Thrown at phases/19-capstone-projects/42-large-corpus-downloader/code/main.py:124 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of rohitg00/ai-engineering-from-scratch@39ea8a1c6d (2026-08-26).
Data as JSON: /api/errors/40390c75053ca599.
Report an issue: GitHub.