Implementing

Blocklist filtering

View this section in the spec ↗

Generation that guarantees the TNID string contains none of a user-supplied set of substrings, such as profanity. The 64-character data alphabet can spell recognizable words; filtered generation retries until none match.

Blocklist

Patterns matched against the 17 data characters after the .. User-supplied; no default list. Implementations:

  • MUST match case-insensitively, as substrings;
  • MUST NOT modify the patterns during matching.

Generation strategy

Variant 1

All payload bits are random: regenerate until nothing matches.

Variant 0

Data characters, counted from 1, come from different bit sources:

CharactersBitsChanges with
1–6TimestampTimestamp
7Timestamp (4), TNID variant (2, always 00)Timestamp
8Timestamp (3), random (3)Random bits
9–17RandomRandom bits
MatchImplementations SHOULD
Touches character 8 or laterRegenerate the random bits
Entirely within characters 1–7Advance the timestamp just far enough to change the match's rightmost (least significant) character: the smallest jump sure to change the match, instead of stepping 1 ms at a time through a possibly long run of matching timestamps

Implementations MUST return an error rather than block indefinitely.

Variant 0 with encryption

With V0/V1 encryption, implementations SHOULD check both the variant 0 and the encrypted variant 1 data strings, resolving matches with the variant 0 strategy.

Interoperability

Non-deterministic: implementations need not produce identical output. They MUST detect matches by case-insensitive substring matching, and returned TNIDs MUST contain no blocklisted words in their data string.