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 returns length * 2 hex 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

VariantInputDigest lengthExpected digest
SHAKE128abc32 bytes5881092dd818bf5cf8a3ddb793fbcba74097d5c526a6d35f97b83351940f2cc8
SHAKE256abc32 bytes483366601360a8771c6863080cc4114d8db44530f8f1e1ee4f94ea37e78b5739

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()