🎯 5 Formas Divertidas de Obtener un Número Único a partir de un String en Java

Carlos ExpositoCarlos Exposito
3 min read

🧠 ¿Por Qué Convertir un String en un Integer?

¿Alguna vez te has preguntado cómo puedes convertir una cadena de texto (como un nombre de usuario, email o ID) en un número único? 🤔 ¡Hoy te muestro 5 formas diferentes de lograrlo en Java, desde lo clásico hasta lo ingenioso!

¿Qué significa único? Que cadenas diferentes generen enteros diferentes, y que la probabilidad de colisión sea muy baja o nula.


🔁 1. hashCode(): Rápido y Furioso

public static int toIntByHashCode(String value) {
    return value.hashCode();
}

Ventajas: Super rápido y fácil.
⚠️ Contras: Puede tener colisiones, especialmente con muchas entradas.

🧪 Ideal para: Caching, claves rápidas no críticas.


🔬 2. Fórmula Personalizada con Chars

public static int toIntByCharFormula(String value) {
    return value.chars()
      .reduce(17, (a, b) -> a * 13 + (b / (a + 1)));
}

🎨 Perfecto si te gusta jugar con matemáticas.
🔁 Es como hacer tu propio mini-hash.


📦 3. Usando CRC32

public static int toIntByCR32(String value) {
    CRC32 crc32 = new CRC32();
    crc32.update(value.getBytes());
    return (int) crc32.getValue();
}

🔐 CRC32 fue diseñado para detectar errores y evitar colisiones.
🧪 Más robusto que hashCode, un poco más lento.


🔐 4. Usando MD5 + Bitshift

public static int toIntByMD5(String value) {
    MessageDigest digest = MessageDigest.getInstance("MD5");
    byte[] hash = digest.digest(value.getBytes());
    return ((hash[0] & 0xFF) << 24) | ((hash[1] & 0xFF) << 16) 
         | ((hash[2] & 0xFF) << 8) | (hash[3] & 0xFF);
}

🛡️ Ultra confiable y con bajo riesgo de colisión.
Más lento, pero útil para generar claves únicas de alta calidad.


💾 5. Lookup Map: ¡Un Diccionario de Verdad!

private static final Map<String, Integer> lookupMap = new HashMap<>();
private static final AtomicInteger counter = new AtomicInteger(Integer.MIN_VALUE);

public static int toIntByLookup(String value) {
    return lookupMap.computeIfAbsent(value, k -> counter.incrementAndGet());
}

🚀 Único garantizado, sin colisiones.
📈 Requiere memoria, ideal si tienes un número limitado de entradas.


🧪 Validación con JUnit

@ParameterizedTest
@MethodSource("implementations")
public void given1kElements_whenMappedToInt_thenItShouldHaveNoDuplicates(Function<String, Integer> implementation) {
    List<Integer> integers = uniqueStringsOfSize(1000).map(implementation).toList();
    assertThat(integers).doesNotHaveDuplicates();
}

¡Así comprobamos que nuestros métodos funcionan bien! ✅


✅ Conclusión

MétodoVelocidad 🚀Riesgo de Colisión ⚠️Unicidad 🛡️Recomendado para...
hashCode()Muy altaMediaCaching rápido
Fórmula CharsAltaMediaDiversión, experimentación
CRC32MediaBajaVerificación, integridad
MD5BajaMuy bajaClaves únicas de confianza
Lookup MapVariableNulaIdentificadores persistentes

¡Elige el que mejor se adapte a tu situación! ¿Cuál te gustó más? 😄

0
Subscribe to my newsletter

Read articles from Carlos Exposito directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Carlos Exposito
Carlos Exposito