J'ai une bibliothèque d'images sur Amazon S3. Pour chaque image, je md5 l'URL source sur mon serveur plus un horodatage pour obtenir un nom de fichier unique. Comme S3 ne peut pas avoir de sous-répertoires, je dois stocker toutes ces images dans un seul dossier à plat.
Dois-je m'inquiéter des collisions dans la valeur de hachage MD5 produite?
Bonus: Combien de fichiers puis-je avoir avant de commencer à voir des collisions dans la valeur de hachage produite par MD5?
La probabilité d'une collision accidentelle de seulement deux hachages est égale à 1/2128qui est 1 sur 340 undecillion 282 décillions 366 milliards en 920 octillions 938 septillions 463 sextillions 463 quintillions 374 quadrillions 607 trillions 431 milliards 768 millions 211 000 456.
Cependant, si vous conservez tous les hachages, la probabilité est un peu plus élevée grâce à paradoxe de l'anniversaire . Pour avoir une chance sur 50% que tout hash entre en collision avec tout autre hash dont vous avez besoin 264 hash. Cela signifie que pour obtenir une collision, vous aurez en moyenne besoin de hachage 6 milliards fichiers par seconde pendant 100 ans .
S3 peut avoir des sous-répertoires. Il suffit de mettre un "/" dans le nom de la clé et vous pourrez accéder aux fichiers comme s’ils se trouvaient dans des répertoires séparés. J'utilise ceci pour stocker les fichiers utilisateur dans des dossiers distincts en fonction de leur ID utilisateur dans S3.
Par exemple: "mybucket/users/1234/somefile.jpg". Ce n'est pas exactement la même chose qu'un répertoire dans un système de fichiers, mais l'API S3 possède certaines fonctionnalités qui lui permettent de fonctionner presque de la même manière. Je peux lui demander de lister tous les fichiers qui commencent par "utilisateurs/1234 /" et il me montrera tous les fichiers de ce "répertoire".
Alors attendez, c'est ça:
md5(filename) + timestamp
ou:
md5(filename + timestamp)
Dans le premier cas, vous êtes en grande partie lié à un GUID, et je ne m'en inquiéterais pas. Dans ce dernier cas, consultez le message de Karg sur la manière dont vous allez éventuellement tomber dans une collision.
Une règle approximative pour les collisions est la racine carrée de la plage de valeurs. Votre signature MD5 est supposée être longue de 128 bits, vous risquez donc de rencontrer des collisions au-delà de 2 ^ 64 images.
Bien que les collisions MD5 aléatoires soient extrêmement rares, si vos utilisateurs peuvent fournir des fichiers (qui seront stockés in extenso), ils peuvent alors gérer les collisions. C'est-à-dire qu'ils peuvent créer délibérément deux fichiers avec le même MD5sum mais des données différentes. Assurez-vous que votre application peut gérer ce cas de manière judicieuse, ou utilisez peut-être un hachage plus fort comme SHA-256.
Bien qu'il y ait eu des problèmes bien connus avec MD5 en raison de collisions, les collisions non intentionnelles entre données aléatoires sont extrêmement rares . D'un autre côté, si vous faites un hachage sur le nom du fichier, il ne s'agit pas de données aléatoires, et je m'attendrais à des collisions rapidement.
Une collision MD5 est extrêmement improbable. Si vous avez 9 000 milliards MD5, il n'y a qu'une chance sur 9 000 milliards qu'il y aura une collision.
Peu importe sa probabilité. c'est possible. Cela peut se produire sur les deux premières choses que vous hachurez (très peu probable, mais possible), vous devrez donc supporter les collisions dès le début.