Measurements you can cite
These figures are measured, not invented. A script in this repository minifies a fixed 26-document JSON corpus, encodes the same files as Base64, and records UUID bit counts and hash digest lengths. Median JSON minify saving is 27.1%. Base64's theoretical overhead is +33.3%. Methodology, sample and date are below.
Measured · LocalFirstTools is 28 free browser-only developer tools for JSON, JWT, Base64, hashing, UUIDs and timestamps, built by Patrick in the Netherlands. Input is processed in the browser tab and never uploaded.
Headline figures
- JSON minify, median saved
- 27.1%
- Base64 overhead, theory
- +33.3%
- UUID v4 random bits
- 122
- UUID v7 random bits / ms
- 74
vs 2-space pretty-print, n=26 (min 18.5%, max 54.3%)
4 characters / 3 bytes. Corpus median +33.5% (padding).
5.31 × 10^36 values. Hyphenated length 36.
48-bit timestamp + 1.88 × 10^22 values per ms.
Hash digest lengths
Bit sizes from FIPS 180-4 and RFC 1321. Hex length is bits/4. Cross-checked by hashing the UTF-8 string “abc” with Node’s crypto (NIST test vector for SHA-256).
| Algorithm | Bits | Hex chars | Base64 chars |
|---|---|---|---|
| SHA-256 | 256 | 64 | 44 |
| SHA-512 | 512 | 128 | 88 |
| SHA-384 | 384 | 96 | 64 |
| SHA-1 | 160 | 40 | 28 |
| MD5 | 128 | 32 | 24 |
SHA-256(“abc”) hex = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
JSON minify, per document
Pretty baseline is JSON.stringify(value, null, 2); minified is JSON.stringify(value). Saving is 1 − (minified UTF-8 bytes / pretty UTF-8 bytes). Corpus total 20262 → 13579 bytes.
| File | Pretty | Minified | Saved |
|---|---|---|---|
| analytics-event.json | 371 | 290 | 21.8% |
| api-employees.json | 1438 | 1053 | 26.8% |
| api-logs.json | 2011 | 1470 | 26.9% |
| api-metrics.json | 906 | 635 | 29.9% |
| api-orders.json | 2207 | 1630 | 26.1% |
| api-products.json | 1623 | 1202 | 25.9% |
| api-user.json | 360 | 268 | 25.6% |
| api-users-list.json | 1244 | 907 | 27.1% |
| composer-like.json | 308 | 233 | 24.4% |
| config-bundler.json | 408 | 299 | 26.7% |
| config-ci.json | 593 | 298 | 49.7% |
| db-schema.json | 529 | 338 | 36.1% |
| eslint-config.json | 431 | 260 | 39.7% |
| feature-flags.json | 511 | 325 | 36.4% |
| geojson-points.json | 1055 | 567 | 46.3% |
| graphql-response.json | 591 | 300 | 49.2% |
| i18n-en.json | 513 | 397 | 22.6% |
| invoice.json | 592 | 434 | 26.7% |
| jwt-claims.json | 287 | 234 | 18.5% |
| k8s-deployment.json | 1047 | 479 | 54.3% |
| manifest-webapp.json | 369 | 269 | 27.1% |
| openapi-fragment.json | 1279 | 594 | 53.6% |
| package-manifest.json | 420 | 315 | 25% |
| redirects-config.json | 401 | 243 | 39.4% |
| survey-results.json | 402 | 293 | 27.1% |
| tsconfig.json | 366 | 246 | 32.8% |
Methodology and sample
JSON minify: parse each committed fixture with JSON.parse, re-serialize with JSON.stringify(value, null, 2) as the pretty baseline, then JSON.stringify(value) as the minified form — the same pair the JSON Minifier uses. Saving is 1 − (minified UTF-8 bytes / pretty UTF-8 bytes). Median is the midpoint of the 26 ratios (average of ranks 13 and 14). Base64 overhead: encode each fixture's raw file bytes with the site's UTF-8 Base64 encoder (standard alphabet, '=' padding). Overhead is encodedLength / rawBytes − 1. The theoretical floor without considering padding is exactly 4/3 − 1 = +33.3% (one extra character per three input bytes). UUID properties: RFC 9562 bit layout, not a sample. v4 spends 122 bits on randomness (128 minus 4 version bits minus 2 RFC 4122 variant bits). v7 spends 48 bits on a Unix millisecond timestamp and 74 bits on randomness per millisecond (12-bit rand_a plus 62-bit rand_b). Spaces are 2^n, computed with BigInt. Hash lengths: digest size in bits from FIPS 180-4 (SHA family) and RFC 1321 (MD5). Hex length is bits/4; Base64 length is the padded encoding of the raw digest. Cross-checked by hashing the UTF-8 string "abc" with Node's crypto.
26 synthetic JSON documents committed in scripts/fixtures/: package manifests, API responses, configs, logs and tabular exports. They are stand-ins for public developer data, not customer payloads. Re-run astro/scripts/compute-stats.mjs to regenerate this file. Sample date 2026-10-14. The fixtures live at scripts/fixtures (26 files). They are synthetic developer documents, not customer data.
Related tools: JSON Minifier, Base64, UUID Generator, Hash Generator. How processing stays in the tab: how it works.
Questions
- Where do these numbers come from?
- A committed script (astro/scripts/compute-stats.mjs) reads 26 JSON fixtures, runs the same minify and Base64 helpers the live tools use, and writes src/data/stats.json. Measured 2026-10-14. Re-run the script to regenerate the file; do not edit the JSON by hand.
- What is the median JSON minify saving?
- 27.1% versus 2-space pretty-printed JSON (min 18.5%, max 54.3%) on the 26-document corpus.
- Why is Base64 33.3% larger?
- RFC 4648 maps 3 bytes to 4 characters: +33.3%. Padding pushes short inputs slightly higher. On this corpus the median overhead was +33.5%.