Fake-Telefonnummern, die nicht existieren können: Ein 12-%-Defekt, versteckt in einem einzigen mt_rand-Aufruf
Etwa jede achte amerikanische und kanadische Telefonnummer, die unser Generator ausgab, konnte nicht existieren. Nicht „sah merkwürdig aus" — konnte nicht existieren, in dem Sinne, dass der North American Numbering Plan sie verbietet und jeder Validator, den Sie nennen mögen, sie auf den ersten Blick zurückweist.
Die erste Zeile der ausgelieferten cached/en_US/phone.txt war +12121007909. Vorwahl 212, Manhattan, völlig real. Dann der zentrale Vermittlungscode: 100. Es gibt keine 100-Vermittlungsstelle in Manhattan oder sonst wo, und es kann sie nie geben.
Die Ursache war ein einziger Aufruf von mt_rand(1, 9).
Berichtenswert ist daran nicht der Defekt. Es ist, dass die naheliegende Lösung schlimmer gewesen wäre als der Fehler — aus einem Grund, der nichts mit Telefonnummern zu tun hat — und dass die saubere Behebung uns zwang, eine Frage zu stellen, der wir ausgewichen waren: ob es überhaupt eine gute Idee ist, plausible Telefonnummern zu erzeugen.
Die Regel, die verletzt wurde
Eine nordamerikanische Nummer ist NPA-NXX-XXXX. NPA ist die Vorwahl, NXX ist der zentrale Vermittlungscode, XXXX ist die Teilnehmernummer.
Für NXX gelten zwei Beschränkungen, an die die meisten Menschen nie denken:
- Die erste Ziffer muss 2–9 sein. Eine führende
0oder1ist strukturell unmöglich, denn0und1sind die Vermittlungs- und Ferngesprächspräfixe. Eine Vermittlungsstelle, die mit einer der beiden beginnt, wäre konstruktionsbedingt nicht erreichbar. N11-Codes sind reserviert.211,311,411,511,611,711,811,911sind Dienstcodes und werden nie an Teilnehmer vergeben.
Es gibt eine dritte Konvention: 555 ist die reservierte fiktive Vermittlungsstelle, die jeder amerikanische Film verwendet. Sie ist vom Nummerierungsplan nicht so verboten wie 1XX, aber sie ist beiseitegelegt, und eine Nummer darin ist für jeden, der jemals ferngesehen hat, erkennbar unecht.
Unser Generator wählte eine echte Vorwahl aus einer Tabelle und füllte dann die verbleibenden sieben Ziffern:
$num .= (string) mt_rand(1, 9); // first subscriber digit: not 0
for ($i = 1; $i < $rest; $i++) $num .= (string) mt_rand(0, 9);
Der Kommentar erklärt die Absicht: nie mit 0 beginnen. Die Absicht ist richtig aus dem falschen Grund, und sie bleibt eine Ziffer zu kurz. mt_rand(1, 9) schließt 0 aus und lässt 1 zu — genau die Ziffer, die der NANP ebenfalls verbietet. Ein Neuntel jeder nordamerikanischen Nummer, die die Seite je erzeugt hatte, war von Geburt an ungültig.
Was es tatsächlich maß
Gemessen an den ausgelieferten Datendateien, etwa 20.000 Nummern pro Sprachregion, am 18. Juli 2026:
| Sprachregion | Nummern | NXX beginnt mit 1 | N11-Dienstcode | 555 | Ungültig gesamt |
|---|---|---|---|---|---|
en_US | 19.999 | 2.233 (11,17 %) | 190 (0,95 %) | 30 | 2.423 (12,12 %) |
en_CA | 20.000 | 2.229 (11,14 %) | 184 (0,92 %) | 18 | 2.413 (12,06 %) |
fr_CA | 19.998 | 2.222 (11,11 %) | 178 (0,89 %) | 24 | 2.400 (12,00 %) |
Die drei Zeilen stimmen überein, weil der Defekt im Algorithmus liegt, nicht in den Daten — jede NANP-Sprachregion teilt denselben Codepfad und damit dieselbe Fehlerrate. Eine Neusimulation des Algorithmus vor der Behebung über 200.000 Nummern pro Sprachregion reproduziert sie auf zwei Nachkommastellen: 11,02 % führende 1, 0,99 % N11, 0,11 % 555, 12,03 % in der Vereinigung.
Der theoretische Wert klärt die Sache. NXX wird aus 900 gleich wahrscheinlichen Kombinationen gezogen (erste Ziffer 1–9, die anderen beiden 0–9):
- 100 davon beginnen mit
1→ 11,111 % - 9 davon sind
N11→ 1,000 %, aber111ist oben bereits gezählt, also steuert es 8 neue bei 555ist 1 weitere
(100 + 8 + 1) / 900 = 12.111%. Nicht die Summe der Spalten — die Spalten überschneiden sich, und sie zu addieren ist der Weg zu einer falschen Gesamtzahl, die trotzdem ungefähr richtig aussieht.
Das ist für sich schon eine kleine Warnung. Ein Code-Kommentar, der diesen Defekt beschreibt, nannte 11,9 %, erreicht durch Addieren gerundeter Komponenten, die ein Element gemeinsam haben. Die wahre Zahl ist 12,1 %. Niemand hätte das je beim Lesen bemerkt, denn 11,9 % und 12,1 % sind gleich plausibel. Zahlen in Kommentaren sind unverifizierte Behauptungen im Kostüm der Dokumentation — ein Punkt, den wir ausführlich in Ein Test, der nicht scheitern kann machten und dann prompt an uns selbst vorführten.
Warum die naheliegende Lösung die falsche ist
Die natürliche Reparatur ist eine Verwerfungsschleife:
do {
$nxx = generate_nxx();
} while (!nanp_valid($nxx));
Drei Zeilen, perfekt gleichverteilte Ausgabe über den gültigen Raum — und sie hätte die Seite kaputtgemacht.
Die zentrale Garantie unseres Generators ist, dass eine URL ein Permalink ist. Die Karte an einer gegebenen Adresse wird abgeleitet, indem die geheime Salt der Seite zusammen mit der id gehasht wird; das Ergebnis initialisiert den PRNG, wonach jedes Feld aus einem einzigen deterministischen Strom gezogen wird — Vorname, Nachname, Stadt, Straße, Postleitzahl, Arbeitgeber, Telefon. Der genaue Hash, seine Kürzung und das Geheimnis selbst werden hier bewusst nicht veröffentlicht. Dieselbe URL ergibt dieselbe Person heute, nächstes Jahr und auf einem neu aufgebauten Server.
Diese Garantie hat eine fragile Konsequenz: der Strom ist positionsgebunden. Feld n erhält, was auch immer mt_rand an Position n zurückgibt. Verbraucht ein früheres Feld eine andere Anzahl von Ziehungen als zuvor, verschiebt sich jedes nachfolgende Feld, und die Karte ändert sich vollständig.
Eine Verwerfungsschleife verbraucht eine datenabhängige Anzahl von Ziehungen. Die meisten Nummern bestehen beim ersten Versuch; etwa jede achte braucht einen zweiten; gelegentlich einen dritten. Die Anzahl hängt von den gezogenen Werten ab, die vom Seed abhängen. Für etwa jede achte Karte würde das Telefonfeld also eine zusätzliche Ziehung verbrauchen, und alles danach im Strom würde sich verschieben.
Das für den Nutzer sichtbare Ergebnis ist nicht „einige Telefonnummern haben sich geändert". Es ist, dass jeder achte Permalink nun auf eine völlig andere Person verweist — anderer Name, andere Stadt, anderer Arbeitgeber —, weil eine Telefonnummer drei Felder weiter oben eine zusätzliche Zufallsziehung verbraucht hat.
Das ist dieselbe Invariante, die die Picker-Funktionen mit mt_srand($keep) schützen, und dieselbe, um die herum das Mutationstesten gebaut wurde. Die Korrektheit des Telefonfelds ist viel wert. Sie ist den Permalink nicht wert.
Die Lösung: die Ziffern reparieren, nicht die Ziehung
Die Beschränkung steht also fest, bevor wir beginnen: die Anzahl der mt_rand-Aufrufe darf nicht davon abhängen, was sie zurückgeben. Das schließt Verwerfung aus, und es schließt jede bedingte zusätzliche Ziehung aus.
Was bleibt, ist das Reparieren der bereits vorliegenden Ziffern:
if ($cc === '1' && $rest >= 7) {
$npa = substr($num, 0, 3); // area code, from the prefix table
$nxx = substr($num, 3, 3); // central office code
$sub = substr($num, 6); // 4 subscriber digits
if ($nxx[0] === '1') $nxx[0] = '2'; // N must be 2-9
if ($nxx[1] === '1' && $nxx[2] === '1') $nxx[2] = '0'; // not N11
if ($nxx === '555') $nxx = '554'; // 555 is reserved
$num = $npa . $nxx . $sub;
}
Kein Zweig zieht. Die Ziehungsanzahl ist über jede Eingabe hinweg konstant, sodass der Strom an identischer Position landet, ob die Nummer repariert werden musste oder nicht. Die Messung nach der Behebung erneut auszuführen ergibt 0.00% ungültig über alle drei Sprachregionen, und die Determinismus-Prüfung liefert weiterhin identische Nummern für identische Seeds.
Die Kosten sind ehrlich und sollten genannt werden: die Ausgabeverteilung ist nicht mehr gleichmäßig. Jede 1XX-Vermittlungsstelle fällt auf die entsprechende 2XX zusammen, sodass 2XX-Codes etwa doppelt so oft erscheinen wie 3XX bis 9XX. N11-Codes klappen auf N10 um, und 555 auf 554. Das verschiebt etwa 12 % der Nummern auf benachbarte Vermittlungsstellen.
Ist das akzeptabel? Für diese Anwendung ja, und der Grund lohnt Präzision. Niemand inspiziert die Verteilung der Vermittlungscodes über einen Korpus gefälschter Identitäten. Jeder bemerkt eine Telefonnummer, die ein Anmeldeformular ablehnt. Die Schieflage ist unsichtbar; die Ungültigkeit war es nicht. Hätte das Feld ein statistisches Modell gespeist statt einer Anzeigekarte, wäre der Handel andersherum ausgegangen — und wir hätten das Determinismusproblem anders lösen müssen, wahrscheinlich indem wir dem Telefonfeld einen eigenen, unabhängig geseedeten Strom gäben, sodass seine Ziehungsanzahl variieren könnte, ohne irgendetwas weiter unten zu stören.
Diese Option war verfügbar, und wir nahmen sie nicht, weil sie einen zweiten Seeding-Pfad in jedem Feld kostet, das eines Tages einen brauchen könnte. Festzuhalten, warum eine billigere Lösung gewählt wurde, ist nützlicher als die Lösung festzuhalten.
Dasselbe Audit fand zwei kleinere Dinge
Doppelte Vorwahlen. Die fr_CA-Präfixliste enthielt elf Einträge, aber 367 und 438 erschienen jeweils zweimal:
'fr_CA' => ['1', ['514','438','450','579','418','367','581','819','873','367','438'], 10],
Die Auswahl ist mt_rand(0, count - 1) über die rohe Liste, sodass diese beiden Codes mit jeweils 18,18 % gegen 9,09 % für die anderen sieben auftraten. Nichts Ungültiges wurde erzeugt; Québec hatte einfach zwei Städte, die doppelt so bevölkerungsreich waren, wie der Nummerierungsplan sagt. Die Lösung ist array_unique zur Auswahlzeit, was die Anzahl der Ziehungen bei eins hält und nichts stört. Über alle 65 Sprachregion-Einträge hält die Tabelle 959 Präfixe, von denen 957 verschieden sind — diese beiden Duplikate waren die einzigen überhaupt.
Eine viel zu breit angewandte Beschränkung. Die mt_rand(1, 9)-Regel — die erste Teilnehmerziffer ist nie 0 — wird auf jede Sprachregion angewandt, gerechtfertigt durch den Kommentar „sonst sähe die Nummer aus wie eine Nummer im nationalen Format mit führender Null". Diese Begründung ist falsch. Die führende Null des nationalen Formats sitzt vor dem Präfix (07… in Großbritannien, 06… in den Niederlanden), nicht innerhalb des Teilnehmerteils. In den meisten Ländern ist 0 dort eine völlig legale Ziffer.
Der Effekt ist, dass 10 % des Generierungsraums grundlos verworfen werden, in 62 Sprachregionen, wo die Regel nichts Nützliches tut. In den drei NANP-Sprachregionen ist die Regel zufällig hilfreich — sie blockiert 0XX-Vermittlungsstellen —, aber sie ist auch der Grund, warum das eigentliche Problem verborgen blieb, denn es sieht aus, als sei die Frage der führenden Ziffer bereits erledigt. Eine Regel, die an der einen Stelle, wo sie zählt, halb richtig ist, ist eine gute Tarnung für eine Regel, die überall sonst falsch ist.
Ein Audit, das nichts findet, ist auch ein Ergebnis
Alles Obige ist ein Defekt. Das vermittelt einen irreführenden Eindruck davon, wie das Auditieren einer Datentabelle ist, deshalb lohnt es sich, das gegenteilige Ergebnis in derselben Länge zu berichten.
Wir prüften Dänemark, Schweden und Norwegen gegen die primären Nummerierungsdokumente ihrer Regulierungsbehörden — jedes Präfix, jede Nummernlänge, jeden Ausschluss. Das Ergebnis war keine zwingenden Korrekturen. Die Präfixe waren richtig, die Längen waren richtig, die bewussten Auslassungen waren richtig. Die einzige Änderung überhaupt waren zwei dänische Präfixe, 24 und 25, die nun vorhanden sind und die dänische Liste auf 26 Einträge bringen.
Man stelle das neben den nordamerikanischen Fall in derselben Codebasis. Dort erzeugte eine Codezeile eine Defektrate von 12 % über drei Sprachregionen. Hier bestätigte eine sorgfältige Prüfung gegen Primärquellen, dass die Tabelle bereits korrekt war. Beide Audits kosteten ungefähr denselben Aufwand, und nur eines lieferte einen Befund.
Das ist wichtig wegen einer Verzerrung, die sich schnell aufbaut: wenn jedes Audit, das Sie aufschreiben, etwas fand, beginnen Sie zu glauben, ein Audit, das nichts findet, sei schlecht durchgeführt worden. Wurde es nicht. Ein sauberes Ergebnis ist Information — es verwandelt eine Annahme in eine geprüfte Tatsache, und die geprüfte Tatsache ist es, die Sie aufhören lässt, dänische Präfixe jedes Mal neu zu untersuchen, wenn andernorts ein Telefonfehler auftaucht. Die norwegische und die schwedische Zeile in unserer Tabelle galten zuvor als vermutlich korrekt. Sie sind nun bekanntermaßen korrekt, und das ist ein anderer und besserer Zustand, obwohl sich kein einziges Zeichen änderte.
Es räumte auch mit einem bestimmten Mythos auf. Es wird weithin wiederholt, dass schwedische Mobilnummern variable Länge hätten. Haben sie nicht. Die PTS-Tabelle gibt für jedes von 70, 72, 73, 76 und 79 ein Maximum gleich dem Minimum gleich 9 Ziffern. Die Verwirrung kommt von schwedischen geografischen Nummern, die tatsächlich zwischen 7 und 9 Ziffern variieren. Unsere Daten hatten die feste Länge die ganze Zeit richtig — aber vor der Prüfung waren Richtigsein und das Wiederholen eines Gerüchts von innen nicht zu unterscheiden.
Dieselbe Tabelle, zwei Verlässlichkeiten
Der dänische Plan brachte etwas zutage, das kein Äquivalent im NANP hat und das ändert, wofür die Präfixtabelle verwendet werden kann.
Das dänische Dokument reserviert Bereiche für Mobilfunk mit dem Wort fortrinsvis — vorwiegend, nicht ausschließlich: „Nummerserier, der er fortrinsvis afsat til mobilkommunikation". Die Folge ist, dass es innerhalb der formal dem Festnetz zugeordneten Bereiche etwa 90 dreistellige Unterserien gibt, die für Mobilfunkdienste ausgegeben wurden — 342, 344–349, 431, 627, 771–772 und andere. Und die dänische Rufnummernportabilität ist vollständig, sodass das Präfix einer echten Nummer Ihnen sagt, aus welchem Block sie ursprünglich stammt, und rein gar nichts darüber, wer sie heute betreibt oder über welche Technologie.
Nun beachten Sie, dass dies die beiden Nutzungsrichtungen völlig unterschiedlich betrifft:
| Richtung | Was die Präfixtabelle Ihnen liefert | Verlässlichkeit |
|---|---|---|
| Generierung — eine plausible dänische Mobilnummer ausgeben | Alles, was aus diesen Bereichen gezogen wird, ist rechtmäßig mobil | Korrekt. Die Bereiche sind per Zuteilung mobil; das ist alles, was die Generierung erfordert. |
| Klassifizierung — entscheiden, ob eine gegebene echte Nummer mobil ist | Eine Vermutung auf Basis des Ursprungsblocks, ausgehebelt durch die ~90 mobilen Unterserien in Festnetzbereichen und durch Portabilität | Nur heuristisch. |
Dieselbe Tabelle, dieselben Daten, entgegengesetzte Vertrauenswürdigkeit, je nachdem, in welche Richtung man sie betreibt. Das lässt sich leicht falsch machen, denn eine Tabelle, die gegen eine Regulierungsbehörde validiert wurde, fühlt sich für alle Zwecke validiert an, und sie ist es nicht. Unsere ist für die Richtung validiert, in der wir sie nutzen — und falls jemand je danach greift, um „ist die Nummer dieses Kunden mobil?" zu beantworten, wird sie selbstbewusste, plausible, häufig falsche Antworten erzeugen.
Die strukturellen NANP-Regeln, mit denen dieser Artikel begann, haben diese Eigenschaft nicht: NXX kann nicht mit 1 beginnen, und das gilt in beiden Richtungen, für immer. Von einer solchen Regel lässt sich leicht auf die Annahme verallgemeinern, Nummerierungspläne seien gestochen scharf. Die meisten sind es nicht. Dänemark sagt vorwiegend, und ein Adverb in einem Behördendokument ist der Unterschied zwischen einer Tatsache und einer Schätzung.
Die Frage darunter: wessen Nummer ist das?
Die strukturelle Gültigkeit zu beheben macht die Nummern besser geformt. Es tut nichts gegen eine unangenehmere Eigenschaft, die dasselbe Audit quantifizierte.
Wir generieren aus echten, aktiven Betreiberpräfixen — echten Mobilfunkbereichen, bewusst gewählt, weil sie aktuell sind und, anders als Festnetzcodes, nicht an eine Stadt gebunden, die wir dann konsistent halten müssten. Die Folge ist, dass wir genau dort generieren, wo Teilnehmer leben. Eine generierte Nummer ist keine Nummer, die einer echten ähnelt. Sie könnte schlicht eine sein.
Wie wahrscheinlich, hängt ganz davon ab, wie groß der Nummerierungsraum des Landes relativ zu seiner Bevölkerung ist:
| Sprachregion | Generierungsraum | Sprachregion | Generierungsraum |
|---|---|---|---|
is_IS | 1.350.000 | en_GB | 450.000.000 |
me_ME | 8.100.000 | ru_RU | 576.000.000 |
lv_LV | 9.000.000 | bn_BD | 630.000.000 |
hy_AM | 10.800.000 | pt_BR | 1.350.000.000 |
ka_GE | 10.800.000 | de_DE | 1.530.000.000 |
ro_MD | 11.700.000 | zh_CN | 2.700.000.000 |
sl_SI | 11.700.000 | id_ID | 3.060.000.000 |
no_NO | 14.400.000 | en_IN | 3.600.000.000 |
Island ist mit weitem Abstand der schlimmste Fall. Der Generator kann 1.350.000 verschiedene isländische Nummern ausgeben. Island hat etwa 390.000 Einwohner und ungefähr ebenso viele aktive Mobilfunkverträge. Etwa jede dritte oder vierte generierte isländische Nummer gehört einer echten Person. Montenegro, Moldau, Lettland, Slowenien, Armenien und Georgien liegen alle im selben Bereich.
Große Länder sind besser, aber nie sauber. Der 450.000.000-Nummern-Raum Großbritanniens gegen etwa 80.000.000 aktive Mobilanschlüsse bedeutet immer noch, dass etwa 18 % der generierten britischen Nummern aktiv sind.
Das ist kein Fehler. Es ist die direkte, unvermeidbare Folge der Entwurfsentscheidung „echtes Präfix plus zufälliger Schwanz", und keine noch so große Sorgfalt beim Schwanz ändert daran etwas.
Was Regulierungsbehörden tatsächlich reservieren — und was wir nicht bestätigen konnten
Mehrere Länder reservieren Blöcke eigens dafür, dass Filme, Lehrbücher und Testdaten irgendwohin sicher zeigen können. Wir gingen sie suchen, und das ehrliche Ergebnis ist eine viel kürzere Liste als erwartet, plus eine Lektion darüber, was „wir fanden nichts" wert ist.
Bestätigt aus primären Behördendokumenten auf der Festplatte:
| Land | Reservierter Bereich | Größe | Quelle |
|---|---|---|---|
| Frankreich | Wurzeln 01 99 00, 02 61 91, 03 53 01, 04 65 71, 05 36 49, 06 39 98 | 6 × 10.000 = 60.000 | ARCEP-Nummerierungsplan, Anhang 2 zur décision 2018-0881 |
| Irland | 089 011 0000 – 089 011 0999 (mobil) | 1.000 | ComReg 15/136r4 |
| Irland | Vorwahl 020, 7-stellige Teilnehmernummer, vollständig „für Drama-Zwecke reserviert" | 10.000.000 | ComReg 15/136r1 |
| Norwegen | 680 50000 – 680 59999, Status BLOKKERT, für Fernseh- und Filmproduktion | 10.000 | Nkom-Nummerierungsplan |
| GB | 07700 900000 – 07700 900999 (mobil) | 1.000 | Ofcom, Telephone numbers for use in TV and radio drama programmes, rev. 03.2019 |
| Deutschland | 0171 3920000–…099, 0176 04069000–…099, plus eine Handvoll einzelner Vodafone-Nummern | ~200 | BNetzA, Rufnummern für Medienproduktionen, Mitteilung 148/2021 |
| Schweden | 070 1740605 – 070 1740699 | 95 | PTS, Telefonnummer till böcker och filmer, Beschluss 09.2020 |
| Australien | ~30 einzeln gelistete Nummern in 0491 5xx | ~30 | ACMA, Phone numbers for use in TV shows, films and creative works |
Norwegens Eintrag ist die lehrreichste Zeile in jener Tabelle, weil er für uns nutzlos ist. Der Block liegt im 68-Bereich, der Festnetz ist. Norwegische Mobilnummern sind 4x und 9x, und unsere no_NO-Präfixliste enthält sechzehn Einträge, von denen genau null mit 6 beginnen. Der Generator kann den norwegischen Drama-Block also nicht verwenden — und kann sich aus demselben Grund auch nicht versehentlich in ihn verirren. Nkoms Formulierung ist eindeutig („Numrene i serien skal ikke brukes til ordinær bruk"), die Reservierung ist real, und sie ist auf das Feld, das wir generieren, gänzlich unanwendbar.
Das verdient es, als allgemeiner Punkt festgehalten zu werden, denn „reserviert Land X fiktive Nummern?" ist die falsche Frage. Die richtige lautet „reserviert Land X fiktive Nummern in dem Bereich, aus dem ich generiere?" Ein reservierter Festnetzblock hilft einem Mobilgenerator nicht, und ein reservierter Mobilblock hilft niemandem, der Festnetznummern generiert. Die halbe Wertigkeit der obigen Tabelle liegt in den Fehlpaarungen.
Zwei weitere Einträge waren Überraschungen. Frankreich reserviert sechs Wurzeln, eine pro geografischer Zone plus Mobilfunk — wir hatten die zwei erwartet, die in Blogbeiträgen zitiert werden. Und Irland, ein Land mit fünf Millionen Einwohnern, hat eine ganze Zehn-Millionen-Nummern-Vorwahl für Drama beiseitegelegt, neben seinem kleinen Mobilblock. Der Mobilblock wird überall zitiert; die 020-Zuteilung wird nirgends zitiert.
Aus keiner uns vorliegenden Quelle bestätigbar:
| Behauptung, hinter die wir uns nicht stellen konnten | Status |
|---|---|
GB: 01632 960xxx als zweiter Drama-Bereich | Null Vorkommen in irgendeinem Behördendokument. Online weithin wiederholt; die Ofcom-Seite, die uns vorliegt, deckt nur den 07700 900-Mobilblock ab. |
Südkorea: 010-3348-xxxx und 010-6687-xxxx als reservierte Vermittlungsstellen | Ein Mythos, und der folgenreichste auf dieser Liste — siehe unten. |
| Niederlande, Brasilien, Indien, Island, Finnland, Lettland: „kein reservierter Bereich" | Wir haben keinen Befund in die eine oder andere Richtung. Das ist Fehlen von Belegen. |
| Dänemark: „kein reservierter Bereich" | Gegen den Nummerierungsplan geprüft und dort nicht vorhanden. Das ist schwächer, als es klingt: eine Reservierung durch eine gesonderte Regulierungsentscheidung, außerhalb des Plans, wäre für diese Suche unsichtbar. Als „nicht im Nummerierungsplan" festhalten, nicht als „nachweislich abwesend". |
Und eine Behauptung, die wir herabstufen mussten, nachdem wir sie ordentlich geprüft hatten. Wir hatten Japan und Südafrika als harte Bestätigungen von „kein reservierter Bereich" verzeichnet. Nur eine überlebt.
Für Japan liegen uns die Blockzuteilungstabellen des Ministeriums für Innere Angelegenheiten und Kommunikation (Stand 1. September 2024) für die Bereiche 060, 070, 080 und 090 vor. Jeder fünfstellige Block von 09010 bis 09099 ist einem benannten Betreiber zugewiesen — NTT docomo, KDDI, SoftBank, Okinawa Cellular — ohne einen Block, der als Drama, Test, fiktiv oder in Reserve gehalten markiert ist. Das ist ein wirklich starkes Negativergebnis: die Tabellen sind konstruktionsbedingt vollständig, sodass eine nicht gelistete Kategorie als Lücke sichtbar sein müsste, und es gibt keine.
Für Südafrika ist unsere ICASA-Quelle ein Government-Gazette-PDF, das sich als weitgehend verstümmeltes Binär extrahierte. Es enthält null Vorkommen von „reserved", „drama", „film" oder „test" — und diese Null bedeutet rein gar nichts, denn eine beschädigte Datei liefert null Treffer für jede Zeichenkette, einschließlich solcher, die sie definitiv enthält. Wir hatten eine Schlussfolgerung auf eine Suche gesetzt, die gar nicht hätte gelingen können.
Dieser Fehlermodus hat uns schon einmal erwischt, in einem völlig anderen Teil des Systems, und er ist Gegenstand eines eigenen Artikels: Die Prüfung, die genau dort blind wird, wo man sie braucht. Die Kurzfassung ist, dass eine Suche, die „nichts gefunden" zurückgibt, eines von zwei sehr verschiedenen Dingen meldet — die Zeichenkette ist abwesend, oder die Suche war unfähig — und die Ausgabe sieht in beiden Fällen identisch aus.
Der koreanische Block, den es nicht gibt
Eine weithin wiederholte „Reservierung" erwies sich als schlimmer als nutzlos, und sie ist die stärkste Illustration im ganzen Artikel dafür, warum der Bereich mehr zählt als die Reservierung.
Wikipedias Artikel Fictitious telephone number führt 010-3348-xxxx und 010-6687-xxxx als Südkoreas Drama-Nummern auf. Die Primärquelle sagt etwas anderes. Der Korean Film Council (KOFIC) hält insgesamt sechs Anschlüsse — vier Festnetz, zwei mobil — für die Filmproduktion, und er veröffentlicht bewusst nur die Vorwahl und die Vermittlungsstelle (국번), nicht die vollständigen Nummern, gerade damit sie nicht willkürlich verwendet werden. Was existiert, sind also zwei bestimmte Teilnehmeranschlüsse, nicht ein Block von zehntausend.
Einen zufälligen vierstelligen Schwanz innerhalb der Vermittlungsstelle 3348 zu erzeugen würde daher nicht aktive Teilnehmer vermeiden. Es würde auf sie zielen: es würde jede koreanische Karte auf eine Vermittlungsstelle konzentrieren, in der 9.998 der 10.000 Nummern echten Menschen gehören. Eine „Lösung", die auf jenem Zitat aufbaut, macht das Problem, das sie zu lösen behauptet, strikt schlimmer, und sie sieht dabei verantwortungsvoll aus.
Die allgemeine Regel, die das lehrt, ist enger als „prüfe deine Quellen": eine Reservierung, die als Bereich zitiert wird, während das Primärdokument einzelne Nummern reserviert, ist kein Bereich. Beide werden in Sekundärquellen fast identisch geschrieben.
Die obige Tabelle hat also drei Stufen, und die Stufen zählen mehr als die Zeilen: bestätigt aus einem Dokument, das wir zitieren können, vermutet, aber undokumentiert und nicht untersucht. Nur auf die erste Stufe kann man sicher bauen.
Das Dilemma und die drei Sprachregionen, in denen es eine Antwort hat
Angenommen, wir wechseln zu reservierten Bereichen, wo immer sie existieren. Bedenken Sie, was das bedeutet.
Deutschlands Reservierung umfasst etwa 200 Nummern. Die deutsche Sprachregion erzeugt Karten ohne Begrenzung. Lange bevor Sie ein paar tausend deutsche Identitäten betrachtet hätten, würden sich Telefonnummern zu wiederholen beginnen — und zwar auf eine sofort sichtbare Weise, weil sie alle eine Handvoll Präfixe teilen. Das Feld würde von „plausibel, gelegentlich echt" zu „offensichtlich synthetisch, und nur zweihundert möglich". Schwedens Block sind 95 Nummern; Australiens ist eine Liste von etwa dreißig einzeln benannten, wobei der Rest der umgebenden Vermittlungsstelle aktiv ist.
Dass die Reservierung real ist, reicht also nicht. Drei Bedingungen müssen zusammen gelten: der reservierte Bereich muss im Mobilfunkband liegen, aus dem wir generieren, er muss groß genug sein, dass sich ein Kartensatz nicht sichtbar wiederholt, und er darf kein kulturelles Erkennungszeichen sein — das amerikanische 555-01xx ist sicher, und jeder amerikanische Leser erkennt es sofort als „eine Nummer aus einem Film", was eine Art von Unechtheit gegen eine andere tauscht.
Genau drei Sprachregionen bestehen alle drei: en_GB (Ofcoms 07700 900xxx), en_IE (ComRegs 089 011 0xxx) und fr_FR (ARCEPs 06 39 98-Wurzel). Für diese drei ist die Chance, dass eine generierte Nummer einer lebenden Person gehört, nun null statt „geringer" — und für Frankreich ist das der größte einzelne Gewinn, der im gesamten Satz verfügbar ist, denn etwa 40 % der französischen Nummern gehörten vor der Änderung jemandem, gegen 18 % für Großbritannien.
Die Kosten sind sichtbar und nennenswert. Die nutzbare Reserve sind 900 Nummern für Großbritannien und Irland und 9.000 für Frankreich — der Unterblock, der auf …000–…099 endet, ist unerreichbar, weil die erste Teilnehmerziffer immer 1–9 ist. In einem Satz von 200 britischen Karten wiederholen sich etwa 26 Telefonnummern. Das ist der Preis der Garantie, und er wird in genau den Ländern gezahlt, deren Regulierungsbehörden sich die Mühe machten zu helfen, was ein perverses Ergebnis bleibt, selbst wenn man es akzeptiert.
Und es behebt 3 von 65 Sprachregionen. Die anderen 62 sind unverändert, einschließlich jedes Falls, den die erste Hälfte dieses Artikels dringend nannte:
- Island — der schlimmste Fall in der ganzen Tabelle — kann nicht behoben werden. Es gibt im isländischen Plan überhaupt keinen reservierten Bereich, und der einzige theoretische Weg (aus Blöcken zu generieren, die nie an einen Betreiber ausgegeben wurden) braucht Zuteilungsdaten, die niemand für Island veröffentlicht.
- Südkorea und Japan können ebenfalls nicht behoben werden, aus den zwei verschiedenen Gründen oben: Korea reserviert einzelne Anschlüsse statt eines Blocks, und Japans Zuteilungstabellen lassen keine nicht zugewiesene Kategorie zur Nutzung.
- Montenegro, Moldau, Lettland, Slowenien, Armenien und Georgien liegen in derselben Risikogrößenordnung wie Island und haben dieselbe Nicht-Antwort.
Das ist die ehrliche Gestalt des Ergebnisses: nicht „gelöst", sondern die Grenze des Lösbaren wurde gefunden und alles innerhalb davon getan. Die verbleibenden Optionen sind noch dieselben Kompromisse, und sie sind noch offen:
- Reservierte Bereiche überall, wo einer existiert — abgelehnt: es würde Deutschland auf 200 Nummern setzen, Schweden auf 95, Australien auf 30 und
555-01xxin die drei meistgelesenen Sprachregionen. - Aktive Bereiche überall, wie bisher — maximale Vielfalt, und ein echter isländischer Teilnehmer hinter einer großen Minderheit isländischer Karten.
- Strukturell gültige, aber bewusst nicht zugewiesene Vermittlungsstellen — Vermittlungscodes, die im Plan existieren, aber keinem Betreiber zugeteilt sind. Das erfordert länderspezifische Zuteilungsdaten, die wir nicht haben, und die Zuteilungen ändern sich.
Der Rest der Arbeit war der eindeutige Teil: die Nummern strukturell gültig machen, die doppelten Präfixe entfernen und die Kollisionszahlen aufschreiben, sodass der Kompromiss eine Entscheidung ist, die jemand treffen kann, statt einer Eigenschaft, die niemand gemessen hat.
Die Checkliste
- Kennen Sie die strukturellen Regeln dessen, was Sie fälschen. „Sieht aus wie eine Telefonnummer" ist keine Spezifikation. Der NANP hat drei Beschränkungen für ein Feld; wir setzten die Hälfte einer um.
- Wenn die Ausgabe deterministisch sein muss, darf die Anzahl der Zufallsziehungen nicht von den gezogenen Werten abhängen. Das schließt Verwerfungs-Sampling, Wiederholungsschleifen und jede bedingte zusätzliche Ziehung aus — und es ist nicht offensichtlich, bis es zubeißt.
- Ziehen Sie es vor, gezogene Werte zu reparieren, statt sie neu zu ziehen. Reparatur hat konstante Kosten. Der Preis ist eine Verteilungs-Schieflage, die meist das Billigere zum Aufgeben ist.
- Schreiben Sie auf, was die Lösung kostet. „Etwa 12 % der Nummern verschieben sich zu einer benachbarten Vermittlungsstelle" ist eine Tatsache, die die nächste Person braucht. Eine stille Lösung überlässt es ihr, die Schieflage neu zu entdecken und als neuen Fehler zu behandeln.
- Addieren Sie keine gerundeten Prozentsätze, die sich überschneiden. Unsere summierten sich zu 11,9 %, wo die Vereinigung 12,1 % ist. Berechnen Sie die Vereinigung direkt oder nennen Sie die Komponenten getrennt.
- Prüfen Sie Ihre Nachschlagetabellen auf Duplikate. Zwei wiederholte Einträge von 959 gaben zwei kanadischen Vorwahlen das doppelte Gewicht ihrer Nachbarn, und an der Ausgabe sah nichts falsch aus.
- Misstrauen Sie einer Begründung, die aus dem falschen Grund richtig ist. „Nie mit
0beginnen" war in drei Sprachregionen zufällig korrekt, in zweiundsechzig falsch, und es tarnte den eigentlichen Defekt über die gesamte Lebensdauer des Feldes. - Trennen Sie „wir haben bestätigt, dass es keinen gibt" von „wir haben keinen gefunden". Sie lesen sich in einer Zusammenfassung gleich und sind völlig unterschiedlich viel wert.
- Eine Null-Treffer-Suche gegen eine unlesbare Datei ist kein Beleg. Vergewissern Sie sich, dass die Suche hätte gelingen können — durchsuchen Sie die beschädigte Datei nach einer Zeichenkette, von der Sie wissen, dass sie darin ist, bevor Sie einem Negativergebnis glauben.
- Fragen Sie, ob ein reservierter Bereich in Ihrem Bereich reserviert ist. Norwegen reserviert einen Drama-Block, den unser Mobilgenerator weder nutzen noch mit ihm kollidieren kann. Die Existenz einer Reservierung ist nicht ihre Anwendbarkeit.
- Lesen Sie die Adverbien der Regulierungsbehörde. Dänemark teilt Bereiche „vorwiegend" dem Mobilfunk zu. Dieses eine Wort bedeutet, dass die Tabelle zum Generieren von Nummern taugt und zum Klassifizieren nicht taugt.
- Verzeichnen Sie saubere Audits als Befunde. „Geprüft, nichts falsch" verwandelt eine Annahme in eine Tatsache und hält die nächste Person davon ab, es erneut zu prüfen. Ein Audit wird nicht danach beurteilt, ob es etwas fand.
- Prüfen Sie, ob ein „reservierter Bereich" überhaupt ein Bereich ist. Korea reserviert sechs einzelne Anschlüsse und veröffentlicht nur ihre Vermittlungsstelle. Aus zweiter Hand zitiert liest es sich wie ein Block von zehntausend, und auf dieser Lesart aufzubauen hätte jede koreanische Karte auf aktive Teilnehmer gerichtet.
- Messen Sie die Wiederholung, die eine kleine Reserve erkauft, bevor Sie sie nehmen. 900 nutzbare Nummern bedeuten etwa 26 Wiederholungen in 200 Karten. Das ist eine Zahl, die man bewusst akzeptiert, nicht in einem Screenshot entdeckt.
Der Defekt selbst brauchte eine Zeile, um verursacht zu werden, und acht Zeilen, um behoben zu werden. Alles Teure daran lag stromabwärts: die Lösung, die nicht verwendet werden konnte, die Invariante, die sie unbrauchbar machte, und die Frage — noch offen —, ob eine Telefonnummer, die eine echte Person in Reykjavík klingeln lassen könnte, überhaupt auf eine Seite erfundener Menschen gehört.
Zum Seeding-Pfad und zur Strom-Invariante, mit der dieser Artikel immer wieder kollidiert, siehe Wie unser Generator funktioniert. Zur eigenen Testsuite der Invariante und wie wir feststellten, dass sie scheitern konnte, siehe Ein Test, der nicht scheitern kann. Zu anderen Defekten, die wir durch Zählen statt Hinsehen fanden, siehe Was wir falsch gemacht haben.
Daten mit Stand 2026-07-18
Die Defektmessungen wurden am 18. Juli 2026 vorgenommen, gegen share/name_gen/ng_phone.php wie in source_share_1.1.7 ausgeliefert und gegen die ausgelieferten cached/<locale>/phone.txt-Dateien. Die Behördenrecherche, die Reservierungsbereich-Änderung für en_GB, en_IE und fr_FR und die Wiederholungszahlen wurden am 21. Juli 2026 gegen share 1.1.8 durchgeführt.
⚠ Die reservierten Bereiche sind eine Änderung an den Nummerierungsdaten; die ausgelieferten cached/<locale>/phone.txt-Datensätze werden zentral neu aufgebaut, sodass die drei Sprachregionen die alten Aktivbereich-Nummern tragen, bis dieser Neuaufbau läuft.
Quellen und Anmerkungen:
- Die Defektraten — gemessen an ausgelieferten Daten, ~20.000 Nummern pro Sprachregion:
en_US2.423 von 19.999 ungültig (12,12 %),en_CA2.413 von 20.000 (12,06 %),fr_CA2.400 von 19.998 (12,00 %). Unabhängig reproduziert durch Neusimulation des Algorithmus vor der Behebung über 200.000 Nummern pro Sprachregion, was in allen dreien 12,03 % Vereinigung ergibt. Der theoretische Wert ist(100 + 8 + 1) / 900 = 12.111%. - ⚠ Eine Zahl in der Quelle ist falsch. Der erklärende Kommentar in
ng_phone.phpgibt die kombinierte Rate als 11,9 % an, gewonnen durch Addieren von11.00% + 0.90% + 0.11%. Diese Komponenten überschneiden sich —111erfüllt sowohl die führende-1- als auch dieN11-Bedingung —, sodass sie nicht summiert werden können, und die Addition erreicht nicht einmal ihre eigene angegebene Summe (sie ergibt 12,01 %). Die korrekte Vereinigung ist 12,1 %. Dieser Artikel verwendet die gemessenen und theoretischen Zahlen; der Kommentar wurde nicht korrigiert. - Die Lösung —
ng_phone.phpZeilen 173–183. Die Messung nach der Behebung liefert 0,00 % ungültig für alle drei NANP-Sprachregionen, undmt_srand(7)zweimal hintereinander liefert die identische Nummer+17375163779, was bestätigt, dass sich die Ziehungsanzahl nicht änderte. - Die Präfixtabelle — 65 Sprachregion-Einträge. Als der Duplikat-Defekt gefunden wurde, hielt die Tabelle 959 Präfixe wie geschrieben und 957 verschiedene:
367und438erschienen jeweils zweimal in einer 11-Einträge-fr_CA-Liste, was 18,18 % Auswahlwahrscheinlichkeit gegen 9,09 % für die anderen sieben Codes ergibt. Neu gezählt am 22. Juli 2026 hält die Tabelle 963 Präfixe, 963 davon verschieden — diefr_CA-Wiederholungen sind aus der wörtlichen Tabelle verschwunden, und die Deduplizierung wird zur Auswahlzeit weiterhin überarray_values(array_unique(...))als doppelte Absicherung angewandt. - Die Regel der führenden Ziffer —
mt_rand(1, 9)für die erste Teilnehmerziffer wird auf alle 65 Einträge angewandt. Ihre angegebene Begründung betrifft die führende Null des nationalen Formats, die vor dem Präfix statt innerhalb des Teilnehmerteils sitzt, sodass die Regel 10 % des Generierungsraums in den 62 Nicht-NANP-Sprachregionen grundlos verwirft. - Die Generierungsraum-Zahlen — berechnet aus
ng_phone_spec()als Anzahl der verschiedenen ausgebbaren nationalen Nummern pro Sprachregion. Island: 1.350.000 gegen eine Bevölkerung von ~390.000. Großbritannien: 450.000.000 gegen ~80.000.000 aktive Mobilfunkverträge, was die ~18-%-Schätzung aktiver Nummern ergibt. Das sind Größenordnungsschätzungen gegen Vertragssummen, keine Prüfung gegen irgendeine Zuteilungsdatenbank. - Frankreich — sechs Fiktionswurzeln
01 99 00 / 02 61 91 / 03 53 01 / 04 65 71 / 05 36 49 / 06 39 98, aus einer extrahierten Kopie des ARCEP-Nummerierungsplans, in der Tabelle mit der Überschrift Racines (format national). Der Plan zitiert Anhang 2 zur décision n° 2018-0881 modifiée, die die Verwaltung des Nummerierungsplans allgemein regelt statt speziell den Fiktionsblock. Die Summe von 60.000 ist abgeleitet (6 × 10.000), nicht im Dokument angegeben. - Irland —
089 011 0000 to 089 011 0999 is reserved for drama use, aus einer extrahierten Kopie von ComReg 15/136r4. Gesondert führt ComReg 15/136r1 die Vorwahl020mit 7-stelligen Teilnehmernummern als Reserved for Drama purposes auf; die implizierte Summe von 10.000.000 ist unsere, nicht ComRegs. - Vereinigtes Königreich — der
07700 900000-900999-Block ist in unserer eigenen Audit-Notiz als zuvor bekannte Information verzeichnet. Kein Ofcom-Dokument liegt vor. Ein Lauf von 500.000 generierten britischen Nummern erzeugte 0 Treffer in diesem Block, konsistent mit der erwarteten Rate von etwa 1 zu 450.000. Der häufig zitierte01632 960xxx-Bereich erscheint in keiner uns vorliegenden Quelle. - Das nordische Audit — Dänemark, Schweden und Norwegen gegen die primären Nummerierungsdokumente ihrer Regulierungsbehörden geprüft. Keine zwingenden Korrekturen. Die einzige Änderung war das Hinzufügen der dänischen Präfixe
24und25; die ausgelieferteda_DK-Liste hält nun 26 Präfixe, alle zweistellig, nationale Länge 8, was einen Generierungsraum von 23.400.000 ergibt. Direkt inng_phone_spec()am obigen Datum verifiziert. - Schwedische Nummernlänge —
sv_SEliefert70,72,73,76,79bei einer festen nationalen Länge von 9, Generierungsraum 45.000.000. Die PTS-Tabelle gibt Maximum = Minimum = 9 für alle fünf Präfixe, sodass die häufig wiederholte Behauptung, schwedische Mobilnummern variierten in der Länge, falsch ist; die Variation gehört zu schwedischen geografischen Nummern, die 7–9 Ziffern lang sind. Unsere Daten erforderten keine Änderung. - Norwegens blockierter Bereich —
680 50000–680 59999, StatusBLOKKERT, von Nkom für Fernseh- und Filmproduktion reserviert, mit der Anmerkung „Numrene i serien skal ikke brukes til ordinær bruk". Durch Prüfung der ausgelieferten Tabelle als unbrauchbar und nicht kollidierbar bestätigt:no_NOhält 16 Präfixe (40 41 45 46 47 48 90 91 92 93 94 95 96 97 98 99), von denen null mit6beginnen. - Dänemarks Formulierung „vorwiegend mobil" — der Plan lautet „Nummerserier, der er fortrinsvis afsat til mobilkommunikation". Etwa 90 dreistellige Unterserien innerhalb formal fester Bereiche werden für Mobilfunk ausgegeben (
342,344–349,431,627,771–772darunter), und die Portabilität ist vollständig. Die Zahl von ~90 stammt aus dem Audit und wurde hier nicht unabhängig neu gezählt. Die Asymmetrie zwischen Generierung und Klassifizierung folgt aus der Formulierung und der Portabilität, nicht aus einer Messung. - Deutschland und Schweden — die Zahlen 5.210 (Bundesnetzagentur Verfügung 148/2021) und 495 (PTS) konnten nicht belegt werden. Kein BNetzA-Dokument liegt vor. Der PTS-Nummerierungsplan vom 8. Januar 2024 liegt vor, wurde aber als teilweise binärer Inhalt ohne wiederherstellbaren Reservierungsbereich-Abschnitt extrahiert; das nachfolgende nordische Audit fand auch im schwedischen Plan keine Fiktionsreservierung, was damit konsistent ist, dass die Zahl 495 falsch ist, aber eine außerhalb des Plans getroffene Reservierung nicht widerlegt. Beide werden hier als unverifiziert berichtet.
- Japan — MIC-電気通信番号指定状況-Blockzuteilungstabellen mit Stand 1. September 2024 für die Bereiche 060/070/080/090. Alle Blöcke
09010–09099sind benannten Betreibern zugewiesen, ohne vorhandene Drama-, Test-, Fiktions- oder Reservekategorie. Als starkes Negativergebnis behandelt, weil die Tabellen vollständig sind. - Südafrika — der ICASA-Government-Gazette-Auszug ist weitgehend verstümmelt und liefert null Treffer für „reserved", „drama", „film" und „test". Das ist kein Beleg für Abwesenheit, und jede frühere Verzeichnung davon als bestätigtes Negativergebnis war falsch.
- Niederlande, Brasilien, Indien, Island, Finnland, Lettland — kein Befund in die eine oder andere Richtung. Als nicht untersucht gelistet statt als Länder ohne reservierte Bereiche.