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


🧠 ¿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étodo | Velocidad 🚀 | Riesgo de Colisión ⚠️ | Unicidad 🛡️ | Recomendado para... |
hashCode() | Muy alta | Media | ❌ | Caching rápido |
Fórmula Chars | Alta | Media | ❌ | Diversión, experimentación |
CRC32 | Media | Baja | ❌ | Verificación, integridad |
MD5 | Baja | Muy baja | ❌ | Claves únicas de confianza |
Lookup Map | Variable | Nula | ✅ | Identificadores persistentes |
¡Elige el que mejor se adapte a tu situación! ¿Cuál te gustó más? 😄
Subscribe to my newsletter
Read articles from Carlos Exposito directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
