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:
| Characters | Bits | Changes with |
|---|---|---|
| 1–6 | Timestamp | Timestamp |
| 7 | Timestamp (4), TNID variant (2, always 00) | Timestamp |
| 8 | Timestamp (3), random (3) | Random bits |
| 9–17 | Random | Random bits |
| Match | Implementations SHOULD |
|---|---|
| Touches character 8 or later | Regenerate the random bits |
| Entirely within characters 1–7 | Advance 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.