File Hash Generator

Checksum one file or a hundred. Each file is streamed through the hash function in your browser, so size is limited by your device rather than by an upload, and nothing ever leaves it.

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

Checksumming files in the browser

A file checksum answers one question: is this byte-for-byte the file I expected? Publishers post a digest next to a download so you can tell a truncated transfer or a tampered mirror from the real thing. Computing it should not require handing the file to anyone.

Why file size is not a limit here

The file is never loaded whole. It is read in four-megabyte slices, each one fed into the hash function's running state and then discarded, which is what a hash function is built to allow. Memory use stays flat whether the file is 2 KB or 20 GB, and because the work is done in measurable pieces there is a genuine progress figure rather than a spinner.

Several algorithms cost one read

Each slice is handed to every selected algorithm before the next slice is read, so producing MD5, SHA-256 and SHA-512 together takes one pass over the file rather than three. Reading from disk is the slow part; the arithmetic is nearly free by comparison.

Files are processed one at a time

Deliberately. Several concurrent readers contend for the same disk, so a batch finishes sooner in sequence and each progress bar means something. A file that cannot be read — a folder, or something the browser is denied access to — is reported on its own row and the batch continues.

See also the Hash Checker.

How large a file can this handle?

There is no fixed limit. Files are read in 4 MB chunks and fed to the hash function incrementally, so the whole file is never held in memory at once. Multi-gigabyte disk images work; they simply take longer.

Why does it hash one file at a time?

Because several concurrent readers compete for the same disk and everything slows down. Sequential processing finishes the whole batch sooner and keeps each progress bar meaningful.

Can I get several algorithms in one pass?

Yes. Tick as many as you like and every chunk is fed to all of them together, so ten algorithms cost one read of the file rather than ten.

Does a folder work?

No — browsers hand a folder over as an unreadable entry. Open it and drop the files inside instead. Any item that cannot be read is reported on its own row and the rest of the batch continues.

What is the TXT export format?

One line per result: the digest, the algorithm, then the filename. It is deliberately close to the layout of sha256sum output so it is easy to read and to diff.