Eu tenho uma biblioteca de imagens no Amazon S3. Para cada imagem, eu md5 o URL de origem no meu servidor mais um carimbo de data e hora para obter um nome de arquivo exclusivo. Como o S3 não pode ter subdiretórios, preciso armazenar todas essas imagens em uma única pasta plana.
Preciso me preocupar com colisões no valor do hash MD5 produzido?
Bônus: quantos arquivos eu poderia ter antes de começar a ver colisões no valor de hash que o MD5 produz?
Respostas:
A probabilidade de apenas dois hashes colidirem acidentalmente é de 1/2 128, que é 1 em 340 undecilhões 282 decilhões 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintilhões 374 quadrilhões 607 trilhões 431 bilhões 768 milhões 211 mil 456.
No entanto, se você mantiver todos os hashes, a probabilidade será um pouco maior, graças ao paradoxo do aniversário . Para ter uma chance de 50% de qualquer hash colidir com qualquer outro hash, você precisa de 2 64 hashes. Isso significa que, para obter uma colisão, em média, você precisará misturar 6 bilhões de arquivos por segundo por 100 anos .
fonte
1 - sPn/s^n
, ondes
está o tamanho do espaço de pesquisa (2^128
neste caso) en
o número de itens com hash. O que você provavelmente está pensando é2^64
: qual é o número aproximado de itens necessários para o hash MD5 para ter 50% de chance de colisão.S3 pode ter subdiretórios. Basta colocar um "/" no nome da chave e você poderá acessar os arquivos como se estivessem em diretórios separados. Eu uso isso para armazenar arquivos de usuário em pastas separadas com base em sua identificação de usuário no S3.
Por exemplo: "mybucket / users / 1234 / somefile.jpg". Não é exatamente o mesmo que um diretório em um sistema de arquivos, mas a API do S3 possui alguns recursos que permitem que ele funcione quase da mesma forma. Eu posso pedir para listar todos os arquivos que começam com "users / 1234 /" e ele me mostrará todos os arquivos desse "diretório".
fonte
Então espere, é isso:
ou:
Se for o primeiro, você está na maior parte do caminho para um GUID, e eu não me preocuparia com isso. Se este for o caso, consulte o post de Karg sobre como você acabará colidindo.
fonte
md5(filename) + timestamp
reduz massivamente o risco de colisão, porque você precisaria ter uma colisão md5 para exatamente o mesmo timestamp para ter uma colisão geral.md5(filename + timestamp)
é o mesmo quemd5(filename)
, assumindo que o nome do arquivo seja aleatório para começar (porque adicionar mais aleatoriedade a algo aleatório altera apenas o resultado individual do md5 e o problema de aniversário ainda existe em todos os hashes do md5).Uma regra prática para colisões é a raiz quadrada do intervalo de valores. Seu MD5 provavelmente tem 128 bits, então é provável que você veja colisões acima e além de 2 ^ 64 imagens.
fonte
Embora colisões MD5 aleatórias sejam extremamente raras, se seus usuários puderem fornecer arquivos (que serão armazenados literalmente), eles poderão criar colisões para que ocorram. Ou seja, eles podem criar deliberadamente dois arquivos com o mesmo MD5sum, mas com dados diferentes. Verifique se o seu aplicativo pode lidar com esse caso de maneira sensata ou talvez use um hash mais forte como o SHA-256.
fonte
Embora tenha havido problemas bem divulgados com o MD5 devido a colisões, colisões não intencionais entre dados aleatórios são extremamente raros . Por outro lado, se você estiver fazendo hash no nome do arquivo, não são dados aleatórios, e eu esperaria colisões rapidamente.
fonte
Realmente não importa a probabilidade; é possível. Isso pode acontecer nas duas primeiras coisas que você faz o hash (muito improvável, mas possível); portanto, você precisará apoiar colisões desde o início.
fonte
A colisão MD5 é extremamente improvável. Se você tem 9 trilhões de MD5s, há apenas uma chance em 9 trilhões de que haverá uma colisão.
fonte