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?
personalId
+sectorID
já 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?Respostas:
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.fonte
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.
fonte
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)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.
fonte