Je dépose un grand nombre de fichiers et pour éviter les collisions de hachage, je stocke également la taille originale d'un fichier - de cette façon, même s'il y a une collision hachage, il est extrêmement improbable que la taille des fichiers soit aussi identique . Est-ce que ce son (une collision de hachage est également susceptible d'être de toute taille), ou est-ce que j'ai besoin d'une autre information (si une collision est plus susceptible d'avoir également la même longueur que l'original). P>
ou, plus généralement: chaque fichier est tout aussi susceptible de produire un hachage particulier, quelle que soit la taille du fichier d'origine? P>
5 Réponses :
dépend de votre fonction de hachage, mais en général, les fichiers de la même taille, mais différents sont moins susceptibles de produire le même hachage que des fichiers de taille différente. Néanmoins, il serait probablement plus propre d'utiliser simplement un hachage testé de temps avec un espace plus grand (par exemple MD5 au lieu de CRC32 ou SHA1 au lieu de MD5) que de parier sur vos propres solutions, telles que la taille de fichier. P>
J'avais envisagé d'utiliser un hachage en combinaison avec la taille du fichier - de cette façon, dans le peu probable même d'une collision, je vérifierais la taille du fichier comme une clé supplémentaire pour voir si c'était vraiment le même fichier.
Je comprends ce que vous visez, mais mon point est que, au lieu de prendre des nœuds supplémentaires pour stocker un fichier de stockage, vous devez simplement prendre une fonction de hachage dont le hachage n'est pas plus grand que votre actuel. Il est beaucoup plus susceptible de produire moins de collisions de cette façon, puisque la définition est arbitraire, tandis que les fonctions de hachage sont spécialement conçues pour éviter les collisions, ces bits supplémentaires seront mieux utilisés de cette façon.
Ah - ça a du sens. Je pensais que je ferais mieux de choisir une fonction de hasch "plus grande" de toute façon, alors peut-être que c'est ce que je finirai par faire.
@Maxshawabkeh Avez-vous une source pour la déclaration "Les fichiers de la même taille, mais différents sont moins susceptibles de produire le même hachage que des fichiers de taille différents" Je suis curieux si les hachages sont pondérés comme celui-ci.
Les fonctions de hachage sont conçues de la manière dont il est très difficile d'obtenir la collision, sinon ils ne seront pas efficaces.
Si vous avez une collision hachage absolument incroyable s> environ 1: number_of_possible_hashes probabilité qui ne dit rien de la taille du fichier. p>
Si vous voulez vraiment être double à propos des collisions de hachage, vous pouvez calculer deux hachages différents pour le même fichier - il sera moins sujet à une erreur que de sauver la taille du fichier Hash +. P>
J'étais en train de faire cela - voir mon autre question, Stackoverflow.com/Questtions/2437345/... . J'ai pensé que l'épargne deux hachages (comme Sha1 et MD5), ainsi que le fichierize, rendra des collisions si astronomiquement improbables que je n'ai jamais à m'en soucier.
Prétendre que vous utilisez SHA256, qui vous donne 2 ^ 256 Valeurs de hachage possibles et vous avez des milliards de fichiers avec des milliers de versions chacune d'une température de 1 000 000 000 * 1 000 000 environ à 2 ^ 50 afin que vous fines avec une moyenne de 2 ^ 200 valeurs de hachage possibles pour chaque fichier sans une menace de collision. N'est-ce pas immense? Pour être plus précis, vous pouvez essayer d'évaluer la probabilité de collision de hachage en calculant 1 - ((((((2 ^ 256) - 10 ^ 15)!) / (2 ^ 256) ^ ( 10 ^ 15)) code> ou s'il n'est pas si précis
1 - (1 - (1 - (1 - (1 - (1 - (1 - (1 - 15) / (2 * 2 ^ 256)) ^ (10 ^ 15) code> qui vous donnera
4E-48 code> chance de collision.
La taille du hachage est la même quelle que soit la taille des données d'origine. Comme il n'y a qu'un nombre limité de hachage possibles, il est théoriquement possible que deux fichiers avec différentes tailles puissent avoir le même hachage. Cependant strong>, cela signifie qu'il est également possible que deux fichiers avec la taille
Le point entier de la famille des hachages cryptographiques (MD5, SHA-X, etc.) est de faire des collisions improbablement improbables. La notion est que les processus juridiques officiels sont préparés à dépendre de celui-ci de la fabrication d'une collision exprès. Donc, vraiment, c'est une mauvaise utilisation de l'espace et du temps de la CPU pour ajouter une courroie aux bretelles de ces hatupes. P>
Les fonctions de hachage sont généralement écrites afin de répartir uniformément les données sur tous les godets de résultats. P>
Si vous supposez que vos fichiers sont répartis uniformément sur une plage fixe de tailles disponibles, permet de dire qu'il n'y a que 1024 (2 ^ 10) répartis uniformément tailles différentes pour vos fichiers. Taille de stockage de fichiers au mieux réduit seulement la chance d'une collision par le nombre de formats de fichiers distincts. P>
Note:. On peut supposer ses 2 ^ 32 tailles réparties uniformément et distincts et il ne change toujours pas le reste du calcul p>
Il est communément admis que la probabilité générale d'une collision sur MD5 (par exemple) est A moins qu'il ya quelque chose qui est spécifiquement construit dans une fonction de hachage qui dit le contraire. Compte tenu de tout valide La combinaison de cela avec les 2 ^ 10 de moyens fichiers distincts en stockant la taille du fichier que vous êtes au plus obtenir un 10 bits supplémentaires qui signifient si les éléments sont différents ou non (encore une fois cela ne concerne que vos fichiers sont répartis uniformément pour toutes les valeurs) . p>
Donc au meilleur tout ce que vous faites très est d'ajouter un autre N octets de stockage pour <= N octets valeur de valeurs uniques (il ne peut jamais être> N). Par conséquent, vous êtes beaucoup mieux pour augmenter les octets retournés par votre fonction de hachage en utilisant quelque chose comme la place SHA-1/2, car cela sera plus susceptible de vous donner une donnée uniformément répartie de valeurs de hachage que de stocker la taille du fichier. p>
En bref, si MD5 est pas assez bon pour les collisions utilisent une plus forte hachage, si les hash plus forts sont trop utiliser lentement, puis rapide em> hachage à faible risque de collisions un tel que MD5, et puis utilisez un plus lent em> hachage tels que SHA-1 ou SHA256 pour réduire le risque d'une collision, mais si SHA256 est assez rapide et l'espace doublé n'est pas un problème, alors vous devriez probablement utiliser SHA256. p> 1 / (2 ^ 128) code>. P>
X code> de telle sorte que la probabilité de
P (MD5 (X) == MD5 (X + 1)) code> reste le même que les deux valeurs aléatoires {
Y code>,
Z code>} Cela revient à dire que
P (MD5 (Y) == MD5 (Z)) code> =
P (MD5 (X) = = MD5 (X + 1)) code> =
1 / (2 ^ 128) code> pour toutes les valeurs de
X code>,
Y code> et < code> Z code>. p>
@BMargulies: Je suppose que je demande généralement, mais j'utilise actuellement SHA1, envisagez de passer à quelque chose comme SHA256. Je me demande simplement combien de temps un hachage est nécessaire si je saisis aussi la taille du fichier.
J'ai eu la même idée. Nous avons besoin de fichiers hachaux, mais nous avons besoin de vitesse maximale (c'est-à-dire MD5) et les fichiers varient énormément dans la taille. S'il est possible d'obtenir le même hachage MD5 sur deux tailles de fichiers différentes, il peut être utile de stocker à la fois la taille MD5 + pour une couche supplémentaire de sécurité. Nous hachons à travers des files de plusieurs millions (peut-être même un milliard), donc dans notre cas, cela peut valoir la valeur de fichier.