La tarjeta de identificación electrónica austriaca se basa en los llamados identificadores de sector. Por ejemplo, un hospital puede identificar a una persona obteniendo un ID de sector para esa persona, que se calcula aproximadamente de la siguiente manera:
sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant
¿Es eso una buena idea? Creo que la posibilidad de colisión, por pequeña que sea, representa un riesgo.
En las tablas hash, cuando hay una colisión, tiene otros medios para establecer la igualdad, pero con las claves primarias no puede tener dos que sean idénticos. Eso se puede evitar con una clave compuesta, pero luego se pierde el punto de un identificador de sector único.
¿Está bien hacer eso y hay una buena manera de hacerlo sin que se rompa en algún momento?
personalId
+sectorID
ya servirá como un identificador único, y como no hay nada allí como una contraseña que deba ocultarse, el hash parece no tener ningún uso real. ¿Qué me estoy perdiendo? ¿O el "personID" es algo secreto?Respuestas:
Este artículo anterior sobre SO le dice cómo calcular la probabilidad de colisión. Para SHA-1, b es 160. El número de personas que viven en austria es inferior a 10 millones. Incluso si cada persona viva en Austria está registrada en un hospital con una identificación única de persona / sector, eso solo hace que la probabilidad de colisión sea menor que
3.5 x 10^-35
. Supongo que debería ser lo suficientemente pequeño para la mayoría de los propósitos prácticos.fuente
Los hashes inevitablemente colisionarán si son más pequeños que todas las combinaciones posibles de datos.
Vea esta excelente respuesta: https://softwareengineering.stackexchange.com/a/145633
Si no se supone que las claves primarias sean significativas (legibles por humanos; que contienen rasgos de datos recuperables), simplemente iría con GUID.
Sí, teóricamente también pueden colisionar, pero es probable que la muerte por calor del universo ocurra primero. Ver https://stackoverflow.com/a/184897
EDITAR: abordar los contrapuntos de @ DocBrown para aclarar las cosas (y evitar largas discusiones en los comentarios)
Generar el identificador a partir de la identificación de la persona o la identificación del sector no era un requisito de OP (de hecho, admitió que recurrir a GUID era lo que él mismo sugirió).
Nunca afirmé que los GUID son adecuados como reemplazo general de SHA-1, o hashing en general (por supuesto, no lo son), solo digo que podrían usarse en este caso particular, para identificar de forma única algunas entidades. Como esto es para lo que están por definición.
Nunca fue un requisito que estos identificadores deben ser reconstruibles a partir de los datos (lo cual es una ventaja de las funciones hash). Evalúe mi respuesta dentro del contexto de la pregunta real.
fuente
personalId + "+" + prefix + sectorId
se garantiza que es único, entonces quizás incluso podría usarse sin procesar, por qué no, SHA1 no agrega ninguna singularidad adicional. El problema, según tengo entendido, es que es posible que esta fórmula no produzca resultados únicos, especialmente si se espera que el sistema funcione durante mucho tiempo (las razones de mantenimiento pueden requerir, por ejemplo, agregar más ID de sector - se recomienda precaución)Usar un hash o GUID como clave principal también es una mala idea porque causa fragmentación del índice y frecuentes divisiones de página.
fuente