Identificación falsa > Artículos > Códigos postales del mundo: por qué no puede existir un generador de direcciones universal

Códigos postales del mundo: por qué no puede existir un generador de direcciones universal

En casi todas las bibliotecas de datos de prueba hay una función parecida a esta:

function postcode() { return str_pad(rand(0, 99999), 5, '0', STR_PAD_LEFT); }

Es incorrecta en 42 de los 64 locales que distribuimos.

No «ligeramente poco idiomática» — estructuralmente incorrecta, en el sentido de que la cadena que devuelve no podría ser un código postal en ese país bajo ninguna circunstancia. Y la razón no es que el cinco sea un número desafortunado. Es que «código postal» no es una sola cosa. Es una etiqueta que hemos estirado sobre varias decenas de sistemas nacionales sin relación entre sí, que codifican objetos distintos a resoluciones distintas, más unos cuantos países que no tienen ningún sistema de ese tipo.

Lo hemos medido sobre nuestros propios datos distribuidos, en lugar de sostenerlo en abstracto.

Qué aspecto tienen realmente 64 locales

Cada fichero de localidades que distribuimos es un triplete City ⇥ Region ⇥ Postcode construido a partir de fuentes reales. Al reducir cada código postal a una forma — dígito → 9, letra → A —, se obtiene la distribución de abajo.

FormaLocalesEjemplos
99999 (5 dígitos)22en_US 10001 · de_DE 10115 · fr_FR 75001 · tr_TR 34000
9999 (4 dígitos)20da_DK 1050 · en_AU 2000 · hu_HU 1051 · ka_GE 0105
999999 (6 dígitos)6en_IN 400001 · ru_RU 101000 · zh_CN 100000 · vi_VN 700000
999 (3 dígitos)2is_IS 101 · zh_TW 100
9999999 (7 dígitos)1he_IL 6100000
9999999999 (10)1fa_IR 1116843734
Contiene letras o separadores12ver más abajo

Datos actualizados a 2026-07-18, medidos sobre los ficheros de localidades distribuidos.

La forma de cinco dígitos es la más frecuente tomada por separado, y aun así sigue siendo una minoría — 22 de 64, alrededor del 34 %. Un generador que emite cinco dígitos en todas partes acierta en aproximadamente un tercio del mundo y se delata en los otros dos tercios. Y la dispersión no es una diferencia de redondeo: Islandia usa tres dígitos, Irán usa diez. Eso supone un factor de 3,3× solo en la longitud.

Los doce que no son solo dígitos

LocaleFormaEjemploQué es la estructura adicional
en_CA / fr_CAA9A 9A9M5H 2N2letras y dígitos alternados
nl_NL9999 AA1011 ABdígitos y luego un sufijo de dos letras
lv_LVAA-9999LV-1050prefijo de país y luego cuatro dígitos
ro_MDAA-9999MD-2001prefijo de país y luego cuatro dígitos
cs_CZ999 99110 00cinco dígitos partidos 3+2 por un espacio
pl_PL99-99900-001cinco dígitos partidos 2+3 por un guion
ja_JP999-9999100-0001siete dígitos partidos 3+4
pt_PT9999-9991000-001siete dígitos partidos 4+3
pt_BR99999-99901000-000ocho dígitos partidos 5+3
en_GBAA9 9AA · A9 9AA · AA99 9AA · AA9A 9AAEC1A 1BBcuatro formas dentro de un mismo país
en_IE16 formas distintasD01 VFEKver la sección sobre Irlanda

Mire Chequia y Polonia juntas. Ambas tienen un sistema de cinco dígitos. Ambas parten esos cinco dígitos. Chequia los parte 3+2 con un espacio, Polonia los parte 2+3 con un guion. No hay ningún principio a su alcance que permita predecir cuál de los dos; hay que saberlo. Lo mismo ocurre con Portugal (9999-999) frente a Japón (999-9999) — siete dígitos en ambos casos, partidos en lugares opuestos.

Y fíjese en lo que hace el separador en Letonia y Moldavia. LV- y MD- no forman parte del contenido informativo del código; son un prefijo de país ISO que estos dos países escriben dentro del propio código. Quítelo y el código sigue funcionando. Quite el espacio de un 1011 AB neerlandés y también sigue teniendo un código válido — pero quite el guion de un 100-0001 japonés y tendrá una cadena de siete dígitos que Japan Post no analizará. Los separadores son unas veces cosméticos y otras veces portadores de información, y cuál de los dos casos se da varía según el país.

El caso de Uganda: 60 códigos que valen todos 00000

Una fila de esa primera tabla es una mentira, y más vale mostrarla que ocultarla.

en_UG figura en la columna de los 5 dígitos. Sus 60 entradas de 60 valen 00000. Uganda no tiene un sistema nacional de códigos postales. No hay nada que poner en el campo, así que el campo lleva un valor de relleno, y un análisis ingenuo de las formas — incluida nuestra propia primera pasada — clasifica a Uganda bajo «cinco dígitos», junto a Alemania y Estados Unidos.

Este es el argumento más fuerte posible a favor de la tesis de este artículo. El esquema tiene una columna postcode, así que todos los países reciben una, así que todos los países parecen tener códigos postales. El modelo de datos fabricó la universalidad que se suponía que debía describir. El recuento honesto de locales genuinamente de cinco dígitos en nuestros datos es de 21, no de 22.

Hay más países en esta situación de los que los desarrolladores suponen — la propia Irlanda fue uno de ellos hasta hace muy poco, lo que nos lleva al sistema más instructivo de todo el conjunto.

Irlanda: el código que identifica un edificio

Irlanda no tuvo ningún sistema nacional de códigos postales hasta julio de 2015. Dublín tenía distritos postales numerados (del D1 al D24) y, en todo el resto del país, una dirección era un nombre de casa, un townland y un condado — literalmente, sin ningún código. El país hizo funcionar su correo así durante todo el siglo XX.

Cuando Irlanda por fin construyó un sistema, no construyó el que tienen todos los demás. Un Eircode consta de siete caracteres en dos partes que cumplen funciones fundamentalmente distintas:

A65 F4E2
└┬┘ └─┬─┘
 │    └── identificador único de UNA propiedad — sin geografía, sin orden
 └─────── clave de enrutamiento — una zona geográfica

Los tres primeros caracteres son geográficos. Los cuatro últimos no lo son. Identifican un edificio concreto, son deliberadamente no secuenciales y no llevan absolutamente ninguna información de localización. Dos casas vecinas de la misma calle tienen Eircodes sin ninguna relación entre sí. «El Eircode de Galway» no existe.

Todas las suposiciones en las que se apoya normalmente un generador de códigos postales fallan aquí de golpe. El código no es jerárquico en su segunda mitad. No se puede interpolar. Los códigos vecinos no son lugares vecinos. No puede deducirlo a partir de una ciudad, porque una ciudad tiene decenas de miles de ellos.

El alfabeto no es el alfabeto

Los Eircodes usan 25 caracteres: los diez dígitos y solo 15 de las 26 letras. Quedan excluidas, deliberadamente:

B  G  I  J  L  M  O  Q  S  U  Z

Lea esa lista junto a los dígitos y la intención del diseño se vuelve evidente. B/8, G/6, I/1, J/1, L/1, O/0, Q/0, S/5, Z/2 — cada una de ellas es un carácter que se lee mal como un dígito, o como otra letra, cuando está escrito a mano o escaneado. El sistema irlandés eliminó la ambigüedad en la fase de diseño en lugar de gestionarla en la fase de análisis.

El conjunto permitido es exactamente ACDEFHKNPRTVWXY0123456789. Un generador que produzca una cadena alfanumérica aleatoria emitirá un carácter prohibido aproximadamente un tercio de las veces, y el resultado no es un Eircode raro o inusual — es una cadena que ningún validador de Irlanda aceptará.

Cómo los generamos

Distribuimos 72 filas irlandesas que llevan 71 claves de enrutamiento distintas, con Eircodes reales completos. Si usáramos el código almacenado tal cual, cada ficha generada para Dublín llevaría el mismo Eircode D01 VFEK — una falsificación inmediata y visible en un país donde los vecinos tienen códigos distintos.

Por eso el motor de ejecución parte el código igual que lo parte el estándar:

if ($locale === 'en_IE' && $postcode !== '') {
    $rk = strtok($postcode, ' ');           // routing key: real, from locality data
    if ($rk !== false && $rk !== '') {
        $EIR = 'ACDEFHKNPRTVWXY0123456789';   // 25 characters, Eircode alphabet
        $uid = '';
        for ($i = 0; $i < 4; $i++) $uid .= $EIR[mt_rand(0, 24)];
        $postcode = $rk . ' ' . $uid;
    }
}

La clave de enrutamiento sigue siendo auténtica y sigue siendo coherente con la ciudad. El identificador de cuatro caracteres — la parte que carece de sentido por diseño — se extrae carácter a carácter del alfabeto correcto. El resultado es geográficamente veraz e individualmente distinto, que es exactamente la forma que tiene el sistema real.

Los 16 patrones distintos que muestra nuestro fichero irlandés son consecuencia de esto: el identificador mezcla libremente letras y dígitos, de modo que A99 AAAA, A99 AA9A y A99 AAA9 no son más que el mismo formato observado en extracciones diferentes.

La excepción que nuestros datos no contienen

Las claves de enrutamiento irlandesas siguen el esquema letra-dígito-dígito — D01, K67, T12, P31. Hay exactamente una que no lo hace: D6W, que cubre Dublin 6 West y lleva una letra en la tercera posición porque Dublin 6W existía como distrito postal antes del Eircode y hubo que conservarlo.

Lo comprobamos, y D6W no está en nuestro fichero. Las 71 claves de enrutamiento que distribuimos coinciden todas con ^[A-Z]\d\d$. No es un fallo del generador — la clave de enrutamiento procede de los datos de localidades y se emite sin cambios, de modo que no se produce nada malformado. Es un hueco de cobertura: nuestros datos irlandeses no pueden generar una dirección de Dublin 6W, y cualquier validador que escribiéramos a partir del patrón observado letter-digit-digit rechazaría un Eircode real.

Lo decimos porque es el tipo de detalle que se redondea en silencio. La expresión regular que coincide con el 100 % de sus datos no es la expresión regular que coincide con el estándar.

Qué codifica realmente cada sistema

La longitud es la diferencia superficial. La más profunda es que estos sistemas no miden el mismo objeto.

PaísCódigoLa unidad que identifica
IrlandaA65 F4E2un edificio
Países Bajos1011 ABun lado de una calle; con el número de portal, una dirección
Reino UnidoEC1A 1BBun pequeño grupo de direcciones de una misma calle
Japón100-0001un chōme — un distrito del tamaño de una manzana
Estados Unidos10001una ruta de reparto / una zona de servicio de una oficina de correos
Islandia101un barrio de una ciudad
Ugandanada; el sistema no existe

Son cinco resoluciones diferentes del mismo campo nominal. El ZIP estadounidense identifica una ruta de reparto — es un artefacto operativo del Postal Service, y por eso los límites de los ZIP cruzan fronteras de ciudades e incluso de estados, y por eso existe la extensión +4 para bajar a un nivel más fino. El código japonés desciende hasta el chōme, una subdivisión con nombre a escala de manzana. El código neerlandés más un número de portal constituye una dirección completa, sin que haga falta el nombre de la calle.

Y la consecuencia para los datos generados es directa. Asignar un solo código postal por ciudad es un defecto cuya visibilidad depende por completo del país en el que se esté. En Estados Unidos es una simplificación benigna — un ZIP real para una ciudad real, solo que no el único. En Irlanda produce una imposibilidad física: miles de personas viviendo en un mismo edificio.

Qué comprobar en cualquier generador de direcciones

  1. Cuente las formas distintas de sus propios datos antes de escribir un validador. Los nuestros tienen siete longitudes puramente numéricas y doce locales con letras o separadores. Una sola expresión regular no va a cubrir eso.
  2. Busque columnas de relleno. Las 60 entradas idénticas 00000 de Uganda pasaron todas las comprobaciones estructurales de que disponíamos. Una columna con un solo valor distinto en todo un locale es una señal, no un dato.
  3. Compruebe el alfabeto, no solo la longitud. Irlanda prohíbe once letras. Una cadena alfanumérica aleatoria falla aproximadamente un tercio de las veces.
  4. Pregúntese qué identifica el código. Si resuelve por debajo de la localidad — un edificio, un lado de calle, una manzana —, entonces un código por ciudad es un error estructural, no una aproximación.
  5. No infiera el estándar a partir de su muestra. Las 71 claves de enrutamiento irlandesas que tenemos son todas letra-dígito-dígito. El estándar permite D6W. Nuestra muestra era unánime y aun así incompleta.
  6. Trate los separadores como datos mientras no se demuestre que son cosméticos. Chequia parte cinco dígitos en 3+2, Polonia parte cinco dígitos en 2+3, y nada en las cifras le dice cuál de las dos.

La conclusión general es la que reaparece una y otra vez en este trabajo. Un campo llamado postcode en el esquema de una base de datos parece un concepto único porque el esquema es una única columna. Los países nunca se pusieron de acuerdo en eso. La universalidad está en su modelo de datos, no en el mundo — y todo generador que confunde la columna con el concepto acaba produciendo direcciones individualmente plausibles y colectivamente imposibles.


Datos actualizados a 2026-07-18

Las formas de formato se calcularon el 18 de julio de 2026 directamente a partir de los 64 ficheros de localidades distribuidos, asignando cada dígito Unicode a 9 y cada letra Unicode a A, y contando después los resultados distintos por locale. Las cifras de la tabla de formas son locales, no filas.

Fuentes y notas:

  • Ficheros de localidades — 64 locales, cada fila un triplete City ⇥ Region ⇥ Postcode. Locales puramente numéricos: 52. Locales que contienen letras o separadores: 12.
  • Irlanda — Eircode. 72 filas, 71 claves de enrutamiento distintas, todas conformes a ^[A-Z]\d\d$; D6W ausente de nuestros datos. Formato: clave de enrutamiento de 3 caracteres + identificador único de propiedad de 4 caracteres. Alfabeto permitido ACDEFHKNPRTVWXY0123456789 (25 caracteres; B G I J L M O Q S U Z excluidas). El Eircode se lanzó en julio de 2015; antes de eso solo existían los distritos postales de Dublín. Nuestro fichero de localidades almacena únicamente la clave de enrutamiento; el identificador de propiedad de 4 caracteres se genera en tiempo de ejecución. Las claves de enrutamiento proceden de la clasificación oficial de Eircode Routing Keys del CSO (tabla PxStat NDQ07, dimensión C03349V04063), publicada bajo licencia CC BY 4.0; las bases de datos de referencia de direcciones y de búsqueda, ECAD y ECAF, son productos comerciales con licencia aparte. <eircode.ie/&gt;
  • Uganda — en_UG. Las 60 filas de localidades llevan todas 00000. Uganda no opera ningún sistema nacional de códigos postales; la columna es un valor de relleno. Los pesos de población de las ciudades también faltan para este locale (UBOS 2014 analizado pero no cargado).
  • Reino Unido — en_GB. 52 filas repartidas en cuatro formas: AA9 9AA (41), A9 9AA (5), AA99 9AA (5), AA9A 9AA (1).
  • Código de generación — la rama irlandesa está en ng_generate.php y añade exactamente cuatro extracciones al flujo inicializado por la semilla, solo para en_IE; los demás locales atraviesan la rama sin verse afectados y sus fichas no se desplazan.
  • Lectura relacionada — el problema afín de qué ciudad se elige, y por qué una selección uniforme infravalora las capitales en un factor de aproximadamente tres, se trata en Por qué los generadores de direcciones producen ciudades implausibles.

← Artículos