Python SHAKE Hash Code Example (Online Runner)
Python SHAKE128/SHAKE256 extendable-output hashing examples with configurable digest length and runnable snippets.
Online calculator: use the site SHAKE text tool.
Calculation method
hashlib.shake_128 and hashlib.shake_256 are extendable-output functions (XOFs). You must specify the output length
in bytes to match the tool’s “digest length” field.
Implementation notes
- Package: built-in
hashlib. - Implementation:
hexdigest(length)expects length in bytes, not hex characters, and returnslength * 2hex chars. - Notes: SHAKE is variable-length; changing the digest length changes the output. Keep the length consistent for verification.
python
import hashlib
from typing import Literal
Variant = Literal["shake128", "shake256"]
def shake_text(text: str, variant: Variant = "shake256", digest_length: int = 32, encoding: str = "utf-8") -> str:
hasher = hashlib.shake_128() if variant == "shake128" else hashlib.shake_256()
hasher.update(text.encode(encoding))
return hasher.hexdigest(digest_length)
# Example usage
payload = "hello world"
print(shake_text(payload, variant="shake128", digest_length=32))
print(shake_text(payload, variant="shake256", digest_length=64))
File hashing example
python
from pathlib import Path
import hashlib
import tempfile
from typing import Literal
Variant = Literal["shake128", "shake256"]
def shake_file(path: Path, variant: Variant = "shake256", digest_length: int = 32, chunk_size: int = 1024 * 1024) -> str:
hasher = hashlib.shake_128() if variant == "shake128" else hashlib.shake_256()
with path.open("rb") as handle:
for chunk in iter(lambda: handle.read(chunk_size), b""):
hasher.update(chunk)
return hasher.hexdigest(digest_length)
with tempfile.TemporaryDirectory() as temp_dir:
sample_path = Path(temp_dir) / "example.bin"
sample_path.write_bytes(b"example payload\n")
print(shake_file(sample_path, variant="shake128", digest_length=32))Test vectors
| Variant | Input | Digest length | Expected digest |
|---|---|---|---|
| SHAKE128 | abc | 32 bytes | 5881092dd818bf5cf8a3ddb793fbcba74097d5c526a6d35f97b83351940f2cc8 |
| SHAKE256 | abc | 32 bytes | 483366601360a8771c6863080cc4114d8db44530f8f1e1ee4f94ea37e78b5739 |
Complete script (implementation + tests)
python
import hashlib
from typing import Literal
Variant = Literal["shake128", "shake256"]
TEST_VECTORS = {
"shake128": {("abc", 32): "5881092dd818bf5cf8a3ddb793fbcba74097d5c526a6d35f97b83351940f2cc8"},
"shake256": {("abc", 32): "483366601360a8771c6863080cc4114d8db44530f8f1e1ee4f94ea37e78b5739"},
}
def shake_text(text: str, variant: Variant = "shake256", digest_length: int = 32, encoding: str = "utf-8") -> str:
hasher = hashlib.shake_128() if variant == "shake128" else hashlib.shake_256()
hasher.update(text.encode(encoding))
return hasher.hexdigest(digest_length)
def run_tests() -> None:
for variant, vectors in TEST_VECTORS.items():
for (text, dk_len), expected in vectors.items():
actual = shake_text(text, variant=variant, digest_length=dk_len)
assert actual == expected, f"{variant} mismatch for {text!r}: {actual} != {expected}"
print("All SHAKE test vectors passed.")
if __name__ == "__main__":
run_tests()