L'uso degli hash per le chiavi primarie è una buona idea?

6

La carta d'identità elettronica austriaca si basa sui cosiddetti identificatori di settore. Ad esempio, un ospedale può identificare una persona ottenendo un ID di settore per quella persona, che viene calcolato in modo approssimativo come segue:

sha1(personalId + "+" + prefix + sectorId); // prefix is constant and irrelevant

È una buona idea? Penso che la possibilità di una collisione, non importa quanto piccola, rappresenta un rischio.

Negli hashtables, quando c'è una collisione, hai altri mezzi per stabilire l'uguaglianza, ma con le chiavi primarie non puoi possederne due uguali. Questo può essere aggirato da una chiave composta, ma il punto di un identificatore di settore univoco viene perso.

È giusto farlo e c'è un buon modo per averlo in quel modo senza che si rompa ad un certo punto?

    
posta Bozho 19.08.2015 - 14:03
fonte

3 risposte

8

Questo ex articolo SO ti spiega come calcolare la probabilità di collisione. Per SHA-1, b è 160. Il numero di persone che vivono in Austria è inferiore a 10 milioni. Anche se ogni persona vivente in austria è registrata in un ospedale con un ID persona / settore univoco, ciò fa solo una probabilità di collisione inferiore al 3.5 x 10^-35 . Immagino che dovrebbe essere abbastanza piccolo per la maggior parte degli scopi pratici.

    
risposta data 19.08.2015 - 16:19
fonte
3

Gli hash si scontrano inevitabilmente se sono più piccoli di tutte le possibili combinazioni di dati.

Guarda questa eccellente risposta: link

Se non si ritiene che le chiavi primarie siano significative (leggibili dall'uomo, contenenti tratti recuperabili di dati), andrei semplicemente con i GUID.

Sì, teoricamente possono scontrarsi, ma è probabile che la morte per surriscaldamento dell'universo avvenga per prima. Vedi link

EDIT: indirizzamento ai contrappunti di DocBrown per chiarire le cose (ed evitare lunghe discussioni nei commenti)

La generazione dell'identificatore dall'identità personale o dall'id del settore non era il requisito dell'OP (anzi, ammetteva che ricorrere ai GUID era quello che lui stesso suggeriva).

Non ho mai affermato che i GUID siano adatti come sostituzione generale di SHA-1 o di hashing in generale (ovviamente non lo sono), sto solo dicendo che potrebbero essere usati in questo caso particolare - per identificare in modo univoco alcune entità . Poiché questo è quello che sono per definizione.

Non è mai stato un requisito che questi identificatori debbano essere ricostruibili dai dati (che è un vantaggio delle funzioni hash). Si prega di valutare la mia risposta nel contesto della domanda reale.

    
risposta data 19.08.2015 - 14:12
fonte
0

L'uso di un hash o GUID come chiave primaria è anche una cattiva idea perché causa la frammentazione dell'indice e intervalli di pagine frequenti.

    
risposta data 20.08.2015 - 00:49
fonte

Leggi altre domande sui tag