Usar hashes para chaves primárias é uma boa idéia?

8

O bilhete de identidade eletrônico austríaco conta com os chamados identificadores de setor. Por exemplo, um hospital consegue identificar uma pessoa obtendo um ID de setor para essa pessoa, calculado aproximadamente da seguinte maneira:

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

Essa é uma boa ideia? Penso que a possibilidade de colisão, por menor que seja, representa um risco.

Nas hashtables, quando há uma colisão, você tem outros meios para estabelecer a igualdade, mas com as chaves primárias, você não pode ter duas idênticas. Isso pode ser contornado por uma chave composta, mas o ponto de um identificador de setor exclusivo é perdido.

Está tudo bem em fazer isso e existe uma boa maneira de fazê-lo dessa maneira sem que ele quebre em algum momento?

Bozho
fonte
Mesmo que esse algoritmo crie uma duplicata, não há outras verificações em um sistema que teriam índices que não permitem duplicatas? Se eu for para outro hospital sem meu cartão de identificação, não haveria outros meios de procurar uma pessoa além desse número?
Jeffo
8
Qual é o sentido de usar um algoritmo de hash? personalId+ sectorIDjá servirá como um identificador exclusivo e, como não há nada como uma senha que deve estar oculta, o hash parece não ter uso real. o que estou perdendo? Ou o "personID" é algo secreto?
Doc Brown
Por que você confiaria em um UUID que normalmente (V4) consiste em 122 bits aleatórios acima de 160 bits? As colisões acidentais serão obviamente mais raras para os últimos.
CodesInChaos
@DocBrown Eu também estava curioso sobre isso. Então, eu encontrei e vinculei acima. Eu perdi o interesse depois de cerca de 10 segundos, então ainda não tenho muita certeza de entender o ponto ... mas, tem algo a ver com privacidade ... eu acho.
svidgen
Se você escolher um hash melhor, nenhum ser humano no planeta sabe como criar uma única colisão. Muitos tentaram.
usr

Respostas:

8

Este artigo anterior do SO explica como calcular a probabilidade de colisão. Para SHA-1, b é 160. O número de pessoas que vivem na Áustria é inferior a 10 milhões. Mesmo que cada pessoa viva na Áustria esteja registrada em um hospital com um ID de pessoa / setor exclusivo, isso apenas torna a probabilidade de colisão menor que 3.5 x 10^-35. Eu acho que isso deve ser pequeno o suficiente para fins mais práticos.

Doc Brown
fonte
1
Bem, você tem certeza de que o argumento terá muito peso com o júri quando se trata de vida e morte?
Deduplicator
1
@Duplicador: Eu acho que a chance de colisão por causa de uma falha de hardware (alguns bits são invertidos na RAM ou armazenamento magnético) ou uma falha humana (por exemplo, um erro de digitação) será muito maior, independentemente de que tipo de ID ou hash é usado. Mas é claro, um pettifogger pode ver isso diferente.
Doc Brown
Meu ponto é que qualquer advogado mais provável é um ... ;-)
Deduplicator
3

Os hashes inevitavelmente colidirão se forem menores do que todas as combinações possíveis de dados.

Veja esta excelente resposta: https://softwareengineering.stackexchange.com/a/145633

Se as chaves primárias não deveriam ser significativas (legíveis por humanos; contendo traços recuperáveis ​​de dados), eu usaria GUIDs.

Sim, teoricamente eles também podem colidir, mas é provável que a morte por calor do universo aconteça primeiro. Consulte https://stackoverflow.com/a/184897


EDIT: endereçando os contrapontos do @ DocBrown para esclarecer as coisas (e evitar longas discussões nos comentários)

Gerar o identificador a partir do ID da pessoa ou do setor não era um requisito do OP (na verdade, ele admitiu que recorrer a GUIDs era o que ele próprio sugeria).

Eu nunca afirmei que os GUIDs são adequados como um substituto geral para o SHA-1, ou hash em geral (é claro que não são), só estou dizendo que eles poderiam ser usados ​​nesse caso específico - para identificar exclusivamente algumas entidades. Como é para isso que servem, por definição.

Nunca foi um requisito que esses identificadores fossem reconstrutíveis a partir dos dados (o que é uma vantagem das funções de hash). Avalie minha resposta dentro do contexto da pergunta real.

Konrad Morawski
fonte
@Bozho, acho que sua sugestão é a melhor possível. O uso de identificadores aleatórios de 128 bits mantém as coisas simples (grande mais já), e você sempre pode prefixar esses valores com algo significativo, se desejar. A única desvantagem é que os valores resultantes seriam longos, mas você não pode ter tudo. Eu suponho que eles não seriam normalmente visíveis para ninguém de qualquer maneira - não seriam usados ​​como alguns PINs que as pessoas devem citar por telefone.
Konrad Morawski
2
Os GUIDs têm 128 bits, o SHA1 produz uma saída de 160 bits. Então, o que faz você acreditar que os GUIDs são uma escolha melhor do que os hashes SHA1 do OP mencionados em sua pergunta?
Doc Brown
1
@DocBrown Eu reconhecidamente não sou um especialista no campo, mas o comprimento da saída por si só não é um problema, qualquer função de hash ainda retornará a mesma saída para a mesma entrada (esse é o ponto). Se personalId + "+" + prefix + sectorIdé garantido que ele é único, talvez seja possível usá-lo bruto, porque não, o SHA1 não adiciona nenhuma exclusividade extra. O problema - como eu o entendo - é que essa fórmula pode não produzir resultados únicos, especialmente se o sistema funcionar por um longo tempo (razões de manutenção podem exigir, por exemplo, adicionar mais IDs de setor - recomenda-se cautela)
Konrad Morawski
5
Ainda não entendi como um GUID é útil aqui. O uso de GUIDs não é um algoritmo de hash, um GUID não pode ser gerado a partir de um personID / setorID. Pode ser usado como uma alternativa para o último, se a geração de personIDs únicos for um problema (o que eu acho que não é), mas não substitui algo como SHA-1.
Doc Brown
1
Os GUIDs do IMHO não estão resolvendo o problema do OP. Os GUIDs são úteis para gerar identificadores únicos de maneira descentralizada - o "registro de base austríaco" é uma instituição praticamente centralizada, eles não têm esse problema - o código do setor personalId + já é um ID exclusivo, por que torná-lo mais complicado? A questão interessante é: por que eles aplicam um hash? Mas isso é algo que espero que o OP nos diga.
Doc Brown
0

Usar um Hash ou GUID como chave primária também é uma má ideia, pois causa fragmentação de índice e divisões de página frequentes.

Gordon Bell
fonte