Output Matcher
The One Node in This Pack That Actually Works
- data
- actual_checksum
- matches
- report
The Output Matcher (class ChecksumValidator) is the quiet, boring node in the comfyui-deterministic-nodes pack - and it's the one that does exactly what it says. It hashes whatever you feed it, compares that hash to one you give it, and tells you in no uncertain terms whether your output is reproducible. No placeholders, no secret sauce. If you care about "did this run produce the same thing as last run," this is the tool.
Why you'd reach for it
ComfyUI is a maze of knobs: update a node pack, swap a scheduler, bump a step count, and suddenly your "same seed" image isn't the same. The Output Matcher gives you a machine-checkable answer instead of squinting at two images. Typical uses: verify a workflow is still byte-identical after you update a pack, prove a "reproducible" generation to a colleague, or gate your own A/B testing so you know a change actually changed something.
How it works
Feed it any data through the data input (it's typed *, so latents, tensors, strings, whatever - ComfyUI doesn't care). It computes a SHA-256 checksum, truncated to 16 hex characters, and compares it to expected_checksum. Three outputs come back:
actual_checksum- the hash it just computedmatches- a BOOLEAN: true/false, ready to drive a workflow conditionreport- a human-readable STRING:DETERMINISTIC: Checksum matches (...)orNONDETERMINISTIC: Expected ... got ...
The tolerance dropdown is where it earns its keep. Four modes:
exact- raw bytes. A literal byte-for-byte comparison.epsilon_1e-6/epsilon_1e-4- rounds values to that precision before hashing, so tiny floating-point wobble doesn't count as a mismatch.structural- hashes only shape + dtype. Same shape, same type, "close enough."
The two gotchas that will bite you
First, if you leave expected_checksum empty, the node reports matches = true and just prints the computed hash. That's not a bug - it's a "capture the baseline" mode - but a lot of people have stared at a green "matches" thinking they verified something when they verified nothing. Capture the hash on a run you trust, paste it in, then trust the boolean.
Second, exact on a latent tensor compares raw GPU bytes, which is a brutal standard. Real reproducible workflows drift at the last bit between runs, across GPUs, or even with the same GPU after a driver update - floating-point accumulation order, the exact problem this pack obsesses over. If you're comparing latent-space output, epsilon_1e-4 or structural is usually the honest setting. Byte-exact is for when you genuinely need it, not for daily use.
Install
Part of comfyui-deterministic-nodes, no extra dependencies beyond torch>=2.0, no models. One install covers all five nodes in the pack - via ComfyUI Manager (search comfyui-deterministic-nodes) or:
cd ComfyUI/custom_nodes
git clone https://github.com/joe002/comfyui-deterministic-nodes
Then restart ComfyUI. Nodes live under JI/Reproducible.
Verdict
Of the five nodes in this pack, this is the one to actually put in a workflow today. It's small, it's honest, and "did this run reproduce?" is a question every serious ComfyUI user should be able to answer mechanically. Wire it onto your decoded image or saved latent, capture a baseline, and never argue with yourself about reproducibility again.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| data | * | — | |
| expected_checksum | STRING | — | |
| toleranceopt | COMBO | 4 options: exact, epsilon_1e-6, epsilon_1e-4, structural |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| actual_checksum | STRING | — |
| matches | BOOLEAN | — |
| report | STRING | — |