All articles Comparisons

DIY Fingerprint Hashing vs a Managed Visitor ID

The first version of almost every in-house fingerprint looks the same. Collect a canvas rendering, the WebGL renderer string, the font list, screen size, timezone and language. Concatenate them, hash the result and call it a device ID. It works in the demo, and it works on your laptop. Then it meets production traffic.

This article walks through what goes wrong and why, and what a managed visitor ID does about each problem. If you’re deciding whether to build, also read build vs buy for device intelligence for the organizational side.

Failure 1: collisions on identical devices

A hash is only as unique as its inputs. Corporate fleets, school Chromebooks and popular phone models ship with identical hardware, identical OS images and identical default fonts. Their canvas and WebGL output is the same pixel for pixel. Hash them, and hundreds of different people share one “device ID”.

The consequences depend on what you build on top of it. A one-trial-per-device rule refuses the second employee at a company that standardized on one laptop model. A fraud flag on one device lands on everyone who happens to share its configuration. Browser fingerprinting entropy explains why some populations have far less entropy than the averages suggest.

Failure 2: drift after updates

The opposite problem is just as common. Browser fingerprints aren’t fixed:

  • A browser update changes how text is anti-aliased, and the canvas hash changes.
  • A GPU driver update changes WebGL parameters.
  • The user installs an app that adds fonts.
  • They plug in an external monitor, and screen dimensions change.
  • They travel, and the timezone changes.

An exact hash treats any of these as a brand-new device. A returning customer becomes a stranger after an ordinary update, and a multi-account check under-counts because one abuser’s device produces several IDs over a few months.

Failure 3: incognito and storage resets

Many DIY systems lean on a cookie or localStorage value as the main identifier and fall back to the hash. Private windows start with empty storage, and so does clearing site data. If the hash part is weak, which it is for the reasons above, the result is a new ID every time someone opens an incognito window. That’s exactly what an abuser does between trial signups.

Browsers also deliberately add noise or reduce precision for some APIs in privacy modes. A naive collector reads those perturbed or blocked values as real signal and produces a new hash, or worse, a hash shared by everyone with the same protection enabled.

Failure 4: blocked and errored signals counted as data

When a canvas read is blocked, or an audio context times out, the collector gets an error string or a constant. If that value goes into the hash, every locked-down browser with the same protection gets the same ID. The Prynt agent marks such values as sentinels and excludes them both from the fingerprint and from matching, so a blocked API never counts as a match.

Failure 5: the browser is the authority

This one isn’t about accuracy. A DIY fingerprint is computed in JavaScript and sent to your server in the request body, so anyone can send any value they like. A script that generates a random “device hash” per signup defeats the whole system without touching a real browser.

The fix is architectural. The browser sends signals to a service that computes the identity server-side, and your backend asks that service for the verified result using a secret key:

// Browser: only a requestId reaches your form
const { requestId } = await prynt.identify({ tag: { action: 'signup' } });

// Server: the verified result, fetched with your secret key
const event = await pryntServer.getEvent(requestId);
event.visitorId;          // computed server-side
event.confidence;         // { score, level }
event.accountsOnDevice;   // your accounts already seen on this device

A forged requestId returns a 404, and a reused one already carries another account’s linkedId. Neither gets far.

What a managed visitor ID adds

Fuzzy, drift-tolerant matching

Instead of hashing and comparing for equality, Prynt’s matching engine pulls candidate devices from several indexes, including exact hashes and a coarser bucket. That way a device whose hashes drifted is still in the candidate set. It then scores each signal by similarity: perceptual closeness for canvas output, set overlap for fonts, field-by-field agreement for WebGL parameters. The weighted similarity has to clear a threshold before two identifications count as the same visitor. When they do, the device record absorbs the new values, so the next update is measured against the latest state.

A stored token can corroborate a match, but only when the hardware signals already agree. That stops someone from copying a cookie onto a different machine to borrow its identity.

A confidence score

Every identification returns confidence: { score, level }. Low confidence means the system isn’t sure, and your rules can treat it that way rather than acting on a weak match. What a confidence score is covers how to use it.

Server-side signals around the ID

The visitor ID is one field among many. The same event carries bot detection, VPN and proxy signals, tampering and virtual-machine detection, and behavioral risk such as how many distinct accounts have used a device in the last 30 days. A DIY hash gives you none of that context.

Maintenance you don’t do

Browsers change their APIs and privacy protections several times a year. A managed agent has to keep up with those changes. An in-house one only gets updated when someone notices the ID rate has gone strange.

When DIY is fine

If the stakes are low, such as deduplicating anonymous page views in analytics, a hash is cheap and errors cost little. The calculation changes once the ID drives a decision that costs money or blocks a person: trial limits, payouts, fraud blocks. Then collisions and drift both turn into incidents.

If you want the code without the vendor, look at open-source device fingerprinting. Prynt is open-core and self-hostable, so the server-side matching, confidence and verification come with it rather than just the collector.

Wrap-up

Hash browser attributes yourself and you get an ID that collides on identical devices, changes after every update and can be forged. A managed visitor ID matches by similarity, reports how confident it is and verifies on your server. Pick based on what you’ll do when the ID is wrong.

Try it free

Prynt is device intelligence with a free tier — visitor IDs, bot & fraud Smart Signals, and behavioral biometrics, powered by a cross-site network. Start free.

Keep reading