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 }}

Encoding The same text in a different encoding is different bytes, so it produces a different digest. UTF-8 unless you are matching a legacy system.
Format
Or just start typing…
{{ r.label }} {{ r.bits }} bits · {{ format }} {{ r.secLabel }}

{{ 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.

Export

Drop files here to hash them

or

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.

Encoding The same text in a different encoding is different bytes, so it produces a different digest. UTF-8 unless you are matching a legacy system.
Format
{{ status }}
{{ f.name }} {{ fmtBytes(f.size) }} Done Hashing {{ f.progress }}% Queued Failed

{{ f.error }}

{{ r.label }} {{ r.bits }} bits

{{ r.value }}

Export

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.

Algorithm
Key as Signing secrets from webhook providers are usually published as hex or Base64. Hashing those characters as literal text produces a different, wrong MAC.
Encoding The same text in a different encoding is different bytes, so it produces a different digest. UTF-8 unless you are matching a legacy system.
Format
HMAC-{{ label(hmacAlgo) }} {{ format }}

{{ 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

or

Hashed in your browser · never uploaded

{{ vFile.name }} {{ fmtBytes(vFile.size) }}
Algorithm A {{ expectedLen }}-character hash could be either of these — pick the one the publisher used. Identified from the hash length.

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 }}

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 }}.

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.

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.