¿Es una buena idea usar hashes para claves primarias?

8

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?

Bozho
fuente
Incluso si este algoritmo crea un duplicado, ¿no hay otras comprobaciones en un sistema que tengan índices que no permitan duplicados? Si voy a otro hospital sin mi tarjeta de identificación, ¿no habría otros medios para buscar a una persona además de este número?
JeffO
8
¿Cuál es el punto de usar un algoritmo hash? personalId+ sectorIDya 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?
Doc Brown
¿Por qué confiarías en un UUID que generalmente (V4) consta de 122 bits aleatorios sobre 160 bits? Las colisiones accidentales obviamente serán más raras para este último.
CodesInChaos
@DocBrown Tenía curiosidad sobre eso yo mismo. Entonces, lo encontré y lo vinculé arriba. Perdí interés después de unos 10 segundos, así que todavía no estoy completamente seguro de ver el punto ... pero, tiene algo que ver con la privacidad ... creo.
svidgen
Si eliges un mejor hash, entonces ningún ser humano en el planeta sabe cómo crear una sola colisión. Muchos lo han intentado.
usr

Respuestas:

8

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.

Doc Brown
fuente
1
Bueno, ¿estás seguro de que la discusión tendrá mucho peso con el jurado cuando se trata de la vida y la muerte?
Deduplicador
1
@Deduplicator: supongo que la posibilidad de colisión debido a una falla de hardware (algunos bits volteando en RAM o almacenamiento magnético) o una falla humana (por ejemplo, un error tipográfico) será mucho mayor, independientemente de qué tipo de ID o hash es usado Pero, por supuesto, un pettifogger podría ver esto diferente.
Doc Brown
Mi punto es que cualquier abogado probablemente sea uno ... ;-)
Deduplicador
3

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.

Konrad Morawski
fuente
@Bozho Creo que tu sugerencia es tan buena como parece. El uso de identificadores aleatorios de 128 bits hace que las cosas sean simples (un gran plus ya), y siempre puede prefijar estos valores con algo significativo si lo desea. El único inconveniente es que los valores resultantes serían largos, pero bueno, no se puede tener todo. Supongo que, de todos modos, no serían visibles para nadie, no se utilizarán, ya que se espera que algunos PIN citen por teléfono.
Konrad Morawski
2
Los GUID tienen 128 bits, SHA1 produce una salida de 160 bits. Entonces, ¿qué te hace creer que los GUID son una mejor opción sobre los hash SHA1 que el OP mencionó en su pregunta?
Doc Brown
1
@DocBrown Ciertamente no soy un experto en el campo, pero la longitud de la salida en sí misma no es un problema, cualquier función hash aún devolverá la misma salida para la misma entrada (ese es el punto). Si personalId + "+" + prefix + sectorIdse 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)
Konrad Morawski
55
Todavía no entiendo cómo se usa un GUID aquí. El uso de GUID no es un algoritmo de hash, no se puede generar un GUID a partir de un personID / sectorID. Podría usarse como una alternativa para este último si la generación de ID de persona únicos fuera un problema (lo cual supongo que no lo es), pero no es un reemplazo para algo como SHA-1.
Doc Brown
1
Los GUID de la OMI no resuelven el problema del OP. Los GUID son útiles para generar identificadores únicos de manera descentralizada : el "registro de base austríaco" es una institución bastante centralizada, no tienen ese problema; el código de sector personalId + ya es una identificación única, ¿por qué hacerlo más complicado? La pregunta interesante es: ¿por qué aplican un hash? Pero eso es algo que espero que el OP nos diga.
Doc Brown
0

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.

Gordon Bell
fuente