Hash Checker
Confirm a download is the file its publisher intended. Paste the checksum, choose the file, and the algorithm is worked out from the hash length. A mismatch shows you where the two values diverge.
{{ textCount }}
{{ textError }}
{{ r.value }}
{{ legacyNames }} {{ legacyNames.indexOf(' and ') === -1 ? 'is' : 'are' }} selected. Practical collisions are public for both, so treat the result as a checksum for spotting accidental corruption — not as evidence that a file is authentic.
Drop files here to hash them
Up to 100 files · any size · read in 4 MB chunks, never uploaded
Files are read, not uploaded. Each one is streamed through the hash function in chunks straight from disk, so a multi-gigabyte image never lands in memory and never leaves your device.
{{ f.error }}
{{ r.value }}
The key never leaves this page. It is not sent to a server, not saved to local storage, and not written into the exported files.
{{ hmacError }}
{{ hmacResult }}
HMAC is not a hash with the key glued on the front. It runs the key through the hash
twice with two different pads, which is what makes it resistant to the length-extension
attacks that break a naïve hash(key + message).
Drop the file you want to check
Hashed in your browser · never uploaded
{{ lengthProblem || vError }}
Hash matches
The {{ vResult.label }} digest of {{ vFile.name }} is identical to the hash you supplied, so this is the file that checksum describes. Letter case and surrounding whitespace were ignored.
Both {{ vResult.computed }}
Hash does not match
This file is not the one that checksum describes. Either the download is incomplete or corrupted, or the file has been altered. Downloading it again is the first thing to try.
Computed {{ vResult.cHead }}{{ vResult.cChar }}{{ vResult.cTail }}
Expected {{ vResult.eHead }}{{ vResult.eChar }}{{ vResult.eTail }}
First difference at character {{ vResult.diffAt + 1 }}.
Paste a hash into both boxes to compare them.
Hashes match
Both are the same {{ cmpResult.len }}-character value, so they identify identical content.
Ignored while comparing: letter case, spaces, line breaks, and any
sha256:-style prefix.
Both {{ cmpResult.a }}
Length {{ cmpResult.len }} — consistent with {{ cmpResult.guess }}.
Hashes are different
These are different lengths — {{ cmpResult.a.length }} and {{ cmpResult.b.length }} characters — so they are digests from two different algorithms, and comparing them tells you nothing about the content.
These two digests differ, so they describe different content.
Hash A {{ cmpResult.aHead }}{{ cmpResult.aChar }}{{ cmpResult.aTail }}
Hash B {{ cmpResult.bHead }}{{ cmpResult.bChar }}{{ cmpResult.bTail }}
First difference at character {{ cmpResult.diffAt + 1 }}.
Text, files and secret keys are hashed in your browser. Nothing you enter is ever uploaded to a server.
Verifying a download
A published checksum lets you confirm that the bytes on your disk are the bytes the author released. It catches two different problems: a transfer that arrived incomplete or corrupted, and a file that has been altered since publication.
What a matching checksum does and does not prove
A match proves the file is the one that digest describes. It proves the file is authentic only if the digest itself came from somewhere an attacker could not also modify. A checksum sitting on the same compromised mirror as the download tells you nothing — which is why projects publish digests on a separate site, or sign them with a GPG key.
The algorithm is inferred from the length
Digest length narrows the field to a handful of candidates: 32 hex characters is MD5, 40 is SHA-1, 64 is SHA-256 or SHA3-256, 128 is SHA-512 or SHA3-512. Choosing the wrong algorithm is the most common cause of a mismatch that has nothing to do with the file, so the choice is made for you wherever the length allows.
When it does not match
Download the file again first — an incomplete transfer is far more likely than an attack. If it still fails, confirm you are comparing against the right release and the right algorithm. Only after both check out is suspicion warranted. Where the two digests first diverge is shown, because a value that differs from the very first character usually means the wrong algorithm, while one that matches for most of its length means corrupted content.
See also the Hash Comparison tool.
Frequently asked questions
Why should I check a checksum at all?
It catches two different problems: a download that arrived incomplete or corrupted, and a file that has been altered since it was published. The second only holds if you got the checksum from a source an attacker could not also change.
Do I have to pick the algorithm?
Usually not. A digest length maps to a small set of algorithms — 64 hex characters means SHA-256 or SHA3-256 — so the choice is narrowed automatically, and when only one fits there is nothing to choose.
My hash was rejected before it even ran. Why?
Its length does not match any algorithm here. That almost always means a character was lost or added while copying. The message says how long the value is and what the common lengths are.
Does case or whitespace matter?
No. Letter case, spaces, line breaks, a leading asterisk from sha256sum output and a sha256:-style prefix are all ignored, because a hash pasted from a terminal or a web page frequently carries them.
It says the hash does not match — now what?
Download the file again first; an incomplete transfer is much more likely than tampering. If it still mismatches, check you are comparing against the right algorithm and the right release. Only then treat it as suspicious.