Fausse carte d'identité > Articles > Des numéros de téléphone trop réguliers

Des numéros de téléphone trop réguliers

Nous avons déjà écrit sur les faux numéros de téléphone qui ne peuvent pas exister — des numéros dont le code de central commençait par un chiffre que le plan de numérotation interdit, soit environ un sur huit de tout ce que le générateur avait jamais produit pour l'Amérique du Nord. Cet article-là traite de numéros individuels qui enfreignent des règles individuelles.

Celui-ci en est l'image miroir, et c'est le défaut le plus difficile à voir, car chaque numéro concerné est correct.

Prenez un corpus de numéros de mobile finlandais générés. Contrôlez-les un par un : indicatif de pays valide, préfixe mobile valide, aucun chiffre interdit, forme correcte, accepté par n'importe quel formulaire sur internet. Comptez maintenant les chiffres. Chaque numéro en a exactement neuf. Les vrais numéros de mobile finlandais en ont huit, neuf ou dix.

Rien ne cloche dans aucun numéro. Tout cloche dans l'ensemble.

Là où la longueur variable est réelle

L'hypothèse selon laquelle un pays possède une longueur de numéro de mobile est presque vraie, et c'est précisément ce qui la rend dangereuse. Elle vaut pour l'immense majorité des plans de numérotation, puis elle cesse de valoir dans une poignée d'endroits, et les exceptions n'ont rien d'obscur.

Finlande. Le numéro de mobile national compte 8 à 10 chiffres, préfixe à deux chiffres inclus — la partie abonné fait 6 à 8 chiffres, selon la réglementation de numérotation du régulateur finlandais (Traficom M32). Les trois longueurs sont actuelles, toutes trois sont en usage, et le plan n'en désigne aucune comme étant la normale.

Nouvelle-Zélande. La longueur dépend du préfixe que vous avez tiré. La plage 21 — la plus ancienne attribution mobile — porte des parties abonné de 6 à 8 chiffres, ce qui donne des numéros nationaux de 8, 9 ou 10 chiffres. Les autres préfixes mobiles portent 7 à 8 chiffres, ce qui donne 9 ou 10. Il n'existe pas de réponse unique, même à l'intérieur du pays, et cette réponse est fonction d'une valeur que vous avez déjà choisie au moment où vous en avez besoin.

Serbie. Préfixe à deux chiffres plus une partie abonné de 6 ou 7 chiffres : des numéros nationaux de 8 ou 9 chiffres.

Et un contre-exemple au moins aussi utile, parce qu'il s'agit de la même erreur pointant dans l'autre sens. Les numéros de mobile suédois sont fréquemment décrits comme étant de longueur variable. Ils ne le sont pas : la table du régulateur donne, pour chaque préfixe mobile, un maximum égal au minimum égal à neuf chiffres. La variabilité dont les gens se souviennent appartient aux numéros géographiques suédois, qui vont bel et bien de 7 à 9 chiffres. L'article compagnon détaille ce contrôle ; ce qu'il faut retenir ici, c'est que « longueur variable » et « longueur fixe » sont deux affirmations que l'on répète sans source, et que le mythe existe dans les deux sens.

Ce que nous livrions

Notre propre table de numérotation contient 65 entrées de locale. Jusqu'à récemment, chacune d'elles décrivait la longueur par un seul entier : indicatif de pays, liste des préfixes mobiles, longueur. Un seul nombre.

Ce schéma n'est pas un bogue au sens ordinaire. C'est une assertion factuelle sur le monde, encodée sous forme de type : la longueur du numéro national est fonction du seul pays. Pour 60 des 65 entrées, cette assertion se trouve être vraie. Pour les cinq autres — la Finlande, la Nouvelle-Zélande et la Serbie dans trois variantes d'écriture — elle est fausse, et le code n'aurait pas pu exprimer la vérité même si quelqu'un l'avait connue.

Le compromis a donc été fait, il l'a été délibérément et il a été consigné : choisir la longueur la plus courante et l'utiliser partout. La Finlande, la Serbie et la Nouvelle-Zélande ont toutes été arrondies à neuf.

Voyez ce que cela a produit. Neuf chiffres est une longueur légale pour un mobile finlandais. C'en est une pour un mobile serbe. C'en est une pour un mobile néo-zélandais. Chaque numéro pris isolément était valide. Et le corpus restait pourtant impossible, car aucune population réelle de numéros de mobile finlandais n'a un histogramme de longueurs à une seule barre.

C'est la forme générale du problème, et elle mérite d'être énoncée pour elle-même :

La validité individuelle n'implique pas la plausibilité collective. Un validateur contrôle un enregistrement au regard des règles. Rien dans ce processus ne peut remarquer que les mille enregistrements qui l'entourent sont tous identiques selon une dimension où la réalité varie.

C'est aussi la raison pour laquelle cette classe de défaut survit aussi longtemps. Le défaut de l'article compagnon se signalait dès l'instant où quelqu'un collait un numéro dans un formulaire. Celui-ci ne se signale que lorsque quelqu'un trace un histogramme, et personne ne trace l'histogramme d'un champ qu'il croit constant.

Les signes révélateurs de données synthétiques trop régulières

La longueur est le signe le plus facile à contrôler, et c'est pourquoi elle sert d'exemple. Ce n'est pas le seul. Si vous générez quoi que ce soit qui est censé passer pour réel, voici les dimensions selon lesquelles les données synthétiques sont typiquement trop propres :

Signe révélateurCe que fait le générateurCe que fait la réalité
Longueur de champ constanteUne longueur par pays / typePlusieurs longueurs permises, coexistant
Sélection uniforme du préfixeChaque préfixe tiré avec la même probabilitéLes parts de marché sont très inégales ; un opérateur peut détenir 40 %
Partie abonné uniformeToutes les terminaisons 10^n également probablesAttribution par blocs et clairsemée ; de larges plages non attribuées
Jamais de collisionsDédoublonné par constructionLes vrais jeux de données contiennent doublons, numéros réattribués, coquilles
Toutes les clés de contrôle validesCalculées correctement à chaque foisLes vraies données transcrites en contiennent une petite fraction d'invalides
Dates parfaitement uniformesAnniversaires répartis également sur l'annéeLes naissances réelles se groupent par mois, jour de semaine, autour de dates par défaut
Chaque champ indépendantChacun tiré de sa propre distributionLa ville est corrélée à l'indicatif régional, le nom de famille à la région, le prénom à l'âge
Exactement un formatForme canonique partoutLes vrais enregistrements mêlent séparateurs, casses et formats hérités

Seuls certains de ces signes méritent d'être corrigés, et le choix dépend entièrement de l'usage prévu des données. L'uniformité parfaite de la partie abonné est invisible pour un humain et coûteuse à corriger correctement, car elle exige des données d'attribution par pays qui changent tous les mois. Un histogramme de longueurs à une seule valeur est visible par quiconque exécute une seule commande, et peu coûteux à corriger. Arbitrer ce compromis est le vrai travail ; la liste ci-dessus n'est que l'inventaire dont vous avez besoin avant de pouvoir arbitrer.

Il y a aussi une limite qui mérite d'être nommée : vous ne pouvez pas tout corriger, et essayer aggrave les choses. Chaque corrélation que vous ajoutez est une corrélation qu'il vous faut désormais maintenir et justifier. L'objectif n'est pas « indiscernable de données réelles » — c'est une course aux armements sans fin et, pour un générateur de personnes inventées, un objectif légèrement dérangeant. L'objectif est « aucun test tenant en une seule commande ne trouve de structure manifestement synthétique ».

La correction, et le piège qu'elle contient

La réparation est un changement de schéma : que le champ longueur puisse porter trois formes au lieu d'une.

length := integer                     // fixed
        | list of integers            // uniform choice within the permitted set
        | map { prefix -> integer|list, "*" -> integer|list }

Soixante des soixante-cinq entrées restent un simple entier et ne sont pas touchées, bit pour bit. Quatre deviennent des listes. Une devient une map.

Vient maintenant le piège, qui est la partie qui justifie l'article. L'option intermédiaire évidente — « rassembler toutes les longueurs que le pays permet et tirer uniformément dans cet ensemble » — est fausse pour la Nouvelle-Zélande, et fausse exactement de la manière dont traite l'article compagnon.

La Nouvelle-Zélande permet 8, 9 et 10 chiffres. Mais 8 chiffres ne sont permis que sur la plage 21. Un tirage uniforme dans {8, 9, 10} appliqué à chaque préfixe produit des numéros à huit chiffres sur 22, 27, 28 et 29, que le plan de numérotation ne contient pas. Vous seriez parti de numéros tous de même longueur et corrects, pour aboutir à des numéros variés et invalides — réintroduisant précisément le défaut qui, dans l'autre article, coûtait 12 % de la production d'une locale.

D'où la forme map, et d'où l'unique détail d'implémentation qui compte vraiment :

Déterminez la longueur après avoir choisi le préfixe, pas avant.

Si la longueur est décidée en premier, le préfixe s'en trouve contraint, et vous avez la dépendance à l'envers. Si le préfixe est décidé en premier, la longueur n'est plus qu'une consultation de table. C'est une réorganisation d'une seule ligne, et c'est toute la différence entre un modèle correct et un modèle qui a l'air plausible.

Le même piège se généralise à tout champ dont les contraintes de validité sont conditionnelles : format du code postal selon la région, longueur de l'identifiant fiscal selon le type d'entité, longueur de l'IBAN selon le pays, format de plaque selon la catégorie de véhicule. Chaque fois que les valeurs permises d'un champ dépendent d'un autre champ, le champ dépendant doit être déterminé en second, et un schéma qui stocke la contrainte sous forme d'ensemble plat plutôt que de table de correspondance ne peut pas exprimer la dépendance du tout. Il aura l'air de fonctionner, car l'ensemble plat est une union correcte — il n'est simplement pas une union correcte au cas par cas.

Uniforme sur les longueurs n'est pas uniforme sur les numéros

Voici la partie où l'honnêteté coûte quelque chose, et c'est la raison pour laquelle nous n'avons pas simplement crié victoire.

Les régulateurs publient quelles longueurs sont permises. Ils ne publient pas combien de numéros de chaque longueur sont en service. Ce n'est pas un oubli : les statistiques d'usage sont des données commerciales détenues par les opérateurs, et le plan de numérotation est un instrument juridique portant sur l'attribution. Ainsi, « quelles longueurs existent » est sourcé, et « à quelle fréquence chacune apparaît » ne l'est pas.

Face à cela, nous tirons uniformément à l'intérieur de l'ensemble correct — juste quant au support, non vérifié quant à la forme, et déclaré comme tel dans le code plutôt que supposé en silence.

Mais notez l'ampleur de la part non vérifiée. Uniforme sur les longueurs est très loin d'uniforme sur les numéros, car chaque chiffre supplémentaire multiplie par dix l'espace disponible :

LocaleEspace à 8 chiffresEspace à 9 chiffresEspace à 10 chiffresTotal
Finlande7 200 00072 000 000720 000 000799 200 000
Serbie8 100 00081 000 00089 100 000
Nouvelle-Zélande900 00054 000 000540 000 000594 900 000

Pour la Finlande, un choix uniforme parmi les trois longueurs envoie un numéro sur trois dans un réservoir qui représente 0,9 % de l'espace total. Tirer uniformément sur l'espace donnerait au contraire 0,9 % / 9,0 % / 90,1 %. Les deux politiques diffèrent d'un facteur 36 dans la bande à huit chiffres. Ni l'une ni l'autre n'est connue pour être la bonne. Ce que l'on peut savoir, c'est qu'elles sont extrêmement différentes, et qu'en choisir une sans remarquer l'écart n'est pas une décision, c'est un accident.

Mesuré sur le corpus généré, notre choix actuel produit :

Locale8 chiffres9 chiffres10 chiffres
Finlande33,0 %33,3 %33,7 %
Serbie49,8 %50,2 %
Nouvelle-Zélande5,7 %47,5 %46,8 %

Les 5,7 % de la Nouvelle-Zélande sont la ligne intéressante. Ils n'ont pas été choisis. Ils découlent de la map : un seul préfixe sur six peut porter huit chiffres, si bien que les numéros à huit chiffres apparaissent à peu près à un sixième d'un tiers. Poser correctement la contrainte a produit, comme effet de bord, une distribution de longueurs non uniforme — ce qui est une petite illustration d'un principe général : modéliser correctement la structure vous offre un réalisme que vous n'avez pas eu à estimer. Partout où vous pouvez remplacer une distribution devinée par une contrainte dure, faites-le ; la contrainte est défendable, la supposition ne l'est pas.

Le coût auquel personne ne s'attend : longueur variable signifie hasard variable

Une note pratique, car c'est la raison pour laquelle ce compromis a existé au départ au lieu d'être corrigé il y a des années.

Si votre générateur dérive un enregistrement entier d'un unique flux déterministe — même entrée, même enregistrement, pour toujours — alors le flux est positionnel. Le champ n consomme ce que le flux produit à la position n. Un champ dont le nombre de tirages dépend des valeurs tirées décale tout ce qui le suit.

Un numéro de téléphone à longueur variable fait exactement cela : choisir une longueur coûte un tirage, puis le nombre de tirages de chiffres dépend de la longueur choisie. Faites-le naïvement, et tout enregistrement contenant un numéro de téléphone finlandais change, y compris tous les champs qui n'ont rien à voir avec les téléphones.

La solution a deux moitiés, et toutes deux méritent d'être reprises :

Ne dépensez le tirage que là où la variabilité est réelle. Une longueur scalaire se résout avec zéro tirage. Soixante locales sur soixante-cinq restent donc intactes — non pas « assez proches », mais identiques de façon vérifiable : les mêmes numéros à partir des mêmes graines, et le flux placé ensuite à la même position. Un changement qui aurait pu tout perturber ne perturbe que cinq entrées.

Confinez la variabilité derrière une frontière qui restaure le flux. Là où un champ a vraiment besoin d'un nombre de tirages dépendant des données, sa place est derrière un appel qui sauvegarde puis restaure la position du flux, de sorte que son coût soit invisible de l'extérieur. C'est le même invariant que l'article compagnon devait protéger lorsqu'il a écarté l'échantillonnage par rejet comme correction des codes nord-américains invalides, et il vaut la peine de lire cet argument avant de concevoir quoi que ce soit autour : Faux numéros de téléphone qui ne peuvent pas exister.

La leçon générale est que le déterminisme n'est ni gratuit ni local. C'est une contrainte sur la forme de chaque fonction de génération du système, et il oppose silencieusement son veto à toute une classe d'implémentations par ailleurs évidentes. Si la Finlande a été arrondie à neuf chiffres pendant des années, ce n'était pas par ignorance au sujet de la Finlande. C'est que la version honnête semblait devoir coûter la garantie de déterminisme, et que personne n'avait mesuré si elle la coûterait réellement. Elle ne l'a pas coûtée : le coût s'est élevé à cinq entrées, et il n'aurait jamais pu être autre chose que cinq entrées.

Mesurez le rayon d'impact avant d'accepter un compromis en son nom. C'est la phrase la plus transposable de cet article.

Comment auditer votre propre corpus généré

Tout cela se contrôle en quelques minutes sur des données que vous possédez déjà.

1. Tracez l'histogramme de chaque champ de longueur. Pas la moyenne, pas le mode — l'histogramme complet. Une seule barre là où la spécification en permet plusieurs, c'est tout le défaut, visible instantanément.

2. Contrôlez l'ensemble permis face à une source primaire, dans les deux sens. Émettez-vous une longueur qui n'est pas permise ? Omettez-vous d'en émettre une qui l'est ? La seconde question est celle que personne ne pose, et c'est celle qui trouve ce bogue.

3. Faites-le par préfixe, pas globalement. Un histogramme de longueurs globalement correct peut être localement impossible. L'ensemble global {8, 9, 10} de la Nouvelle-Zélande est juste ; appliqué au préfixe 27, il est faux. Toute contrainte conditionnelle doit être auditée au niveau où vit la condition.

4. Comparez la forme de votre distribution, pas seulement son support. Obtenir le bon ensemble de valeurs permises, ce sont les premiers 80 %. Être uniforme sur les valeurs ou uniforme sur l'espace qu'elles représentent est, dans au moins un cas réel, une question d'un facteur 36.

5. Consignez ce qui est sourcé et ce qui est supposé, à l'intérieur de l'artefact. « Ces longueurs proviennent du régulateur ; les proportions entre elles sont une hypothèse, car les statistiques d'usage ne sont pas publiées » tient en une phrase. Sans elle, un lecteur futur ne pourra pas distinguer une distribution mesurée d'une valeur de remplissage, et lui fera soit trop confiance, soit refera le travail.

6. Cherchez d'autres constantes qui ne devraient pas en être. Le champ longueur à entier unique n'était l'erreur de personne ; c'était une hypothèse que personne n'avait formulée. Tout scalaire dans une table de spécification est une affirmation selon laquelle la grandeur ne varie pas. Certaines de ces affirmations sont fausses, et aucune n'est signalée.

La liste de contrôle

  1. Un champ qui vaut toujours la même valeur est une hypothèse, pas un fait. Contrôlez l'hypothèse face à une source primaire avant de livrer le schéma qui l'encode.
  2. La validité individuelle n'implique pas la plausibilité collective. Chaque numéro peut satisfaire à toutes les règles alors que le corpus reste impossible.
  3. Tracez l'histogramme des champs que vous croyez constants. Ce sont ceux que personne n'a jamais tracés.
  4. Quand une contrainte est conditionnelle, déterminez d'abord la condition. Le préfixe avant la longueur, la région avant le format de code postal, le type d'entité avant la longueur de l'identifiant.
  5. Ne corrigez pas une régularité excessive en ajoutant de la variation uniforme. Uniforme sur l'union des valeurs permises engendre des valeurs permises quelque part et invalides ici. C'est un défaut pire que celui dont vous étiez parti.
  6. Distinguez le support de la forme. Les régulateurs publient ce qui est permis ; presque personne ne publie ce qui est utilisé. Dites lequel des deux vous détenez.
  7. Uniforme sur les catégories n'est pas uniforme sur l'espace. Pour tout ce qui est positionnel, chaque position supplémentaire multiplie l'espace par la base ; un choix plat sur les longueurs est un choix extrêmement non plat sur les valeurs.
  8. Préférez une contrainte dure à une distribution estimée. Une structure que vous pouvez défendre l'emporte sur un réalisme qu'il a fallu deviner, et elle produit souvent ce réalisme gratuitement.
  9. Mesurez le rayon d'impact d'un compromis avant de l'accepter. « Cela changerait tout » a été la raison pour laquelle une valeur connue comme fausse a été livrée pendant des années. Elle aurait changé cinq entrées sur soixante-cinq.
  10. Gardez le nombre de tirages aléatoires indépendant des valeurs tirées, ou cachez la dépendance derrière une frontière. Le déterminisme est une contrainte globale sur des implémentations locales.

L'article compagnon se terminait sur une question à laquelle il ne pouvait pas répondre : générer des numéros de téléphone plausibles est-il seulement une bonne idée, sachant qu'un numéro plausible dans un petit pays a de bonnes chances d'appartenir à quelqu'un. Cet article n'y répond pas davantage. Ce qu'il ajoute, c'est l'autre moitié de « plausible » : un numéro peut être individuellement indiscernable d'un vrai et se trouver malgré tout dans un corpus qu'aucune population réelle ne pourrait produire. Les deux moitiés doivent tenir, et une seule des deux est quelque chose qu'un validateur peut contrôler pour vous.

Pour les règles structurelles, les plages de fiction réservées et l'argument du déterminisme dans son intégralité, voyez Faux numéros de téléphone qui ne peuvent pas exister. Pour le même échec « le schéma affirmait quelque chose sur le monde » dans un autre champ, voyez Les systèmes de codes postaux et pourquoi il n'existe pas de générateur universel. Pour un défaut qui restait invisible parce que toutes les métriques agrégées le déclaraient sain, voyez La moitié de votre liste pondérée n'est pas pondérée.


Données arrêtées au 2026-07-21

Tous les chiffres ont été mesurés le 21 juillet 2026 sur la table de numérotation livrée et sur le corpus généré. Les distributions de longueurs ont été redérivées pour cet article par mesure directe des fichiers générés et par simulation sur 10 000 numéros par locale, et non reprises du journal des modifications.

Sources et notes :

  • Composition de la table — 65 entrées de locale. 60 portent une longueur scalaire ; 4 portent une liste de longueurs permises (la Finlande, ainsi que la Serbie dans les variantes d'écriture cyrillique, latine et par défaut) ; 1 porte une map indexée par préfixe (la Nouvelle-Zélande). Les cinq entrées variables représentent trois pays, puisque les trois entrées serbes ne diffèrent que par l'écriture et doivent être tenues en phase les unes avec les autres.
  • Finlande — numéros de mobile nationaux de 8, 9 ou 10 chiffres, formés d'un préfixe à deux chiffres plus une partie abonné de 6 à 8 chiffres, selon la réglementation Traficom M32. Huit préfixes mobiles sont livrés. Espace de génération par longueur : 7 200 000 / 72 000 000 / 720 000 000, soit un total de 799 200 000.
  • Nouvelle-Zélande — la plage 21 permet 8, 9 ou 10 chiffres ; les cinq autres préfixes mobiles livrés permettent 9 ou 10. Espace de génération par longueur : 900 000 / 54 000 000 / 540 000 000, soit un total de 594 900 000. La part observée de 5,7 % de numéros à huit chiffres est une conséquence de la contrainte, pas une cible configurée.
  • Serbie — 8 ou 9 chiffres, formés d'un préfixe à deux chiffres plus une partie abonné de 6 ou 7 chiffres. Neuf préfixes dans l'entrée par défaut, huit dans chaque variante d'écriture. Espace de génération : 8 100 000 / 81 000 000.
  • Suède — les préfixes mobiles portent un maximum égal au minimum égal à 9 chiffres, si bien que l'affirmation largement répétée d'une longueur variable des numéros de mobile suédois est fausse ; les numéros géographiques suédois, eux, varient bel et bien, de 7 à 9 chiffres. Établi lors d'un audit antérieur face à la table de numérotation du régulateur et rapporté dans l'article compagnon ; non revérifié ici.
  • Distribution de longueurs mesurée — à partir du corpus généré sur le disque, en comptant les chiffres après l'indicatif de pays. Finlande : 6 597 / 6 656 / 6 743 numéros sur 19 996 à 8 / 9 / 10 chiffres, soit 33,0 % / 33,3 % / 33,7 %. Serbie : 9 952 / 10 044 sur 19 996 à 8 / 9 chiffres, soit 49,8 % / 50,2 %. Nouvelle-Zélande : 1 138 / 9 499 / 9 362 sur 19 999 à 8 / 9 / 10 chiffres, soit 5,7 % / 47,5 % / 46,8 %. Une simulation indépendante de 10 000 tirages par locale les reproduit à quelques dixièmes de point de pourcentage près.
  • Chiffres de l'espace de génération — calculés, pour chaque préfixe, comme 9 × 10^(length − prefix digits − 1), sommés sur les préfixes et les longueurs. Le premier chiffre de la partie abonné est contraint à ne pas valoir zéro, d'où vient le facteur 9.
  • Les proportions entre les longueurs ne sont pas vérifiées. Le choix à l'intérieur d'un ensemble permis est uniforme. Les plans de numérotation indiquent quelles longueurs sont autorisées ; ils n'indiquent pas combien de numéros de chaque longueur ont été attribués, et les données d'attribution au niveau des opérateurs n'étaient pas disponibles. Cela est consigné comme une hypothèse explicite dans la source plutôt que laissé implicite.
  • Les locales à longueur scalaire sont inchangées — vérifié en générant à partir de graines fixes avant et après le changement de schéma et en comparant à la fois les numéros émis et la position du flux aléatoire ensuite ; les quatre locales contrôlées par sondage ont produit une sortie identique et une position de flux ultérieure identique. Une longueur scalaire ne consomme aucun tirage, ce qui explique que le changement soit sans effet pour 60 des 65 entrées.
  • Le compromis historique — la Finlande, la Serbie et la Nouvelle-Zélande étaient auparavant fixées à 9 chiffres, ce qui était consigné dans la source comme une limitation délibérée du format à un seul entier et non comme une conviction au sujet de ces pays. Neuf chiffres est une longueur permise dans les trois, de sorte qu'aucun numéro généré sous l'ancienne règle n'était invalide.

← Articles