fonction de hachage unique?
Dans notre application, nous allons être remis images png avec un ~200 caractères tableau d'octets. Je veux enregistrer l'image avec un nom de fichier correspondant à ce bytearray, mais pas l'objet bytearray lui-même, car je ne veux pas 200 caractères des noms de fichiers. Donc, ce que je pensait que je voudrais économiser de l'objet bytearray dans la base de données, puis MD5 pour obtenir un nom de fichier court. Quand il est temps d'afficher une image en particulier, je lève les yeux de son bytearray, MD5, puis recherchez le fichier.
So far So good. Le problème est que, potentiellement, deux bytearrays pourrait hachage vers le bas pour le même MD5. Ensuite, un fichier permettrait de remplacer l'autre. Ou peuvent-ils? Je pense que mes questions sont
- Pourrait-deux ~200 char bytearrays MD5 hash vers le bas à la même chaîne?
- S'ils le pouvaient, est-il une fois-par-10-âges de l'univers sorte de deal ou quelque chose qui pourrait éventuellement se produire dans mon application?
- Est-il un algorithme de hachage qui va produire une (dis) 32 chaine de caractères qui est garanti pour être unique?
- Je ne comprends pas la nécessité de déterminer automatiquement le nom de fichier par certains arbitraire de calcul. Il suffit de créer quelques clés... de nom de fichier ou de quoi que ce soit et de les stocker sur le côté de la 200 char tableau d'octets et de l'utiliser comme nom de fichier. Prend le calcul de la composition et rend le code sous-jacent plus simple...
- Merci de capitaliser de manière conventionnelle.
- jsobo - la raison pour laquelle je veux utiliser un hachage (ou similaire) la fonction est que, dans beaucoup de cas, la source de bytearray (et png) sera la même pour les différents utilisateurs, afin que je puisse éviter d'enregistrer plusieurs versions d'un même png dans cette instance. C'est à dire, si 100 personnes tous ont le même objet bytearray (en raison de la même option) puis ils ont tous partager le même fichier png.
Vous devez vous connecter pour publier un commentaire.
Il est logiquement impossible d'obtenir un 32 octets de code à partir de 200 source d'octets qui est unique parmi tous les possibles de 200 octets sources, puisque vous pouvez stocker plus d'informations à 200 octets de 32 octets.
Ils seule exception serait que les informations stockées dans ces 200 octets, s'inscrivent également dans 32 octets, dans ce cas, votre source de format de date serait extrêmement inefficace et de l'espace pour y perdre.
Lors de hachage (par opposition à chiffrer), vous êtes à la réduction de l'espace d'informations, de données hachés, donc il y a toujours un chance de collision.
Le mieux que vous pouvez espérer dans une fonction de hachage, c'est que tous les hachages sont répartis uniformément dans le hachage de l'espace et de votre hachage de sortie est assez grand pour fournir votre "une fois-par-10-âges de l'univers sorte de "deal" comme vous dites!
Donc, si un hachage est "assez bon" pour vous, dépend de la conséquences d'une collision. Vous pouvez toujours ajouter un id unique à un checksum/hash pour obtenir le meilleur des deux mondes.
Pourquoi n'utilisez-vous pas un ID unique à partir de votre base de données?
La probabilité que deux hachages seront susceptibles d'entrer en collision dépend de la valeur de hachage de taille. MD5 produit de hachage de 128 bits. Donc, pour 2128+1 nombre de hachages, il y aura au moins un collision.
Ce nombre est 2160+1 pour SHA1 et 2512+1 pour SHA512.
Ici cette règle s'applique. Plus la sortie de bits le plus de l'unicité et de plus le calcul. Il y a donc un compromis. Ce que vous avez à faire est de choisir un optimal.
Considérant qu'il y a plus de 200 chaînes d'octets de 32 chaînes d'octets (condensés MD5), qui est garanti d'être le cas.
Toutes les fonctions de hachage ont ce problème, mais certains sont plus robustes que MD5. Essayez de SHA-1. git est utilisé pour le même but.
Il peut arriver que deux hachages MD5 entre en collision (les mêmes). En 1996, une faille a été trouvé dans l'algorithme MD5, et cryptanalysts recommandé de passer à de hachage SHA-1 de l'algorithme.
Donc, je vous conseille de passer à SHA-1 (40 caractères). Mais ne vous inquiétez pas: je doute que vos deux photos obtiendrez le même hash. Je pense que vous pouvez assumer ce risque dans votre application.
Comme l'autre l'a dit avant. De hachage ne marche pas vous donner ce dont vous avez besoin, sauf si vous êtes très bien avec le risque de collision.
De la base de données est utile ici.
Vous obtenez index unique pour chaque 200 long de la chaîne. Pas de collisions ici, et vous devez définir votre 200 noms longs pour être indexé, de la sorte, il va utiliser plus de mémoire, mais il fera le tri pour vous, ce qui rend la recherche très très vite. Vous obtenez identifiant unique qui peut être facilement utilisé pour les noms de fichiers.
J'ai pas beaucoup travaillé sur les algorithmes de hachage, mais selon ma compréhension, il ya toujours une chance de collison dans l'algorithme de hachage soit deux differnce objet peut être haché à la même valeur de hachage, mais il est garanti que chaque fois qu'un objet sera haché à la même valeur de hachage. Il existe d'autres techniques qui peuvent être utilisés pour cela , comme linéaire de détection.