ComfyUI Node

Output Matcher

The One Node in This Pack That Actually Works

By JosephOIbrahim·Created 8 months ago·Updated 8 months ago· 1
Output Matcher
  • data
  • actual_checksum
  • matches
  • report
expected_checksum
tolerance

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 computed
  • matches - a BOOLEAN: true/false, ready to drive a workflow condition
  • report - a human-readable STRING: DETERMINISTIC: Checksum matches (...) or NONDETERMINISTIC: 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.

CategoryJI/Reproducible

Inputs (3)

NameTypeDefaultDescription
data*
expected_checksumSTRING
toleranceoptCOMBO4 options: exact, epsilon_1e-6, epsilon_1e-4, structural

Outputs (3)

NameTypeDescription
actual_checksumSTRING
matchesBOOLEAN
reportSTRING