Probabilité de collisions de code de hachage 64 bits
Le livre Numérique Recettes propose une méthode pour calculer 64 bits des codes de hachage afin de réduire le nombre de collisions.
L'algorithme est illustré à http://www.javamex.com/tutorials/collections/strong_hash_code_implementation_2.shtml et est copié ici pour référence:
private static final createLookupTable() {
byteTable = new long[256];
long h = 0x544B2FBACAAF1684L;
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 31; j++) {
h = (h >>> 7) ^ h;
h = (h << 11) ^ h;
h = (h >>> 10) ^ h;
}
byteTable[i] = h;
}
return byteTable;
}
public static long hash(CharSequence cs) {
long h = HSTART;
final long hmult = HMULT;
final long[] ht = byteTable;
final int len = cs.length();
for (int i = 0; i < len; i++) {
char ch = cs.charAt(i);
h = (h * hmult) ^ ht[ch & 0xff];
h = (h * hmult) ^ ht[(ch >>> 8) & 0xff];
}
return h;
}
Mes questions:
1) Est-il une formule pour estimer la probabilité de collisions en tenant compte de la soi-disant Paradoxe d'Anniversaire?
2) Pouvez-vous estimer la probabilité de collision (j'.e deux clés de hachage à la même valeur)? Disons qu'avec les touches de 1 000 et 10 000 clés?
MODIFIER: reformulé/corrigé de la question 3
3) Est-il sûr de supposer que, d'une collision avec un nombre raisonnable de touches (disons, moins de 10 000 clés) est donc improbable de sorte que si 2 des codes de hachage sont les mêmes, nous pouvons dire que les touches sont les mêmes sans aucune autre vérification? par exemple,
static boolean equals(key1, key2) {
if (key1.hash64() == key2.hash64())
return true; //probability of collision so low we don't need further check
return false;
}
Ce n'est pas pour la sécurité, mais la vitesse d'exécution est impératif afin d'éviter de nouvelles vérifications des touches de gagner du temps. Si la probabilité est tellement faible, disons moins de (1 à 1 milliard de dollars pour 100,000 clés), il sera probablement acceptable.
TIA!
source d'informationauteur isapir | 2014-02-26
Vous devez vous connecter pour publier un commentaire.
En utilisant le Paradoxe d'Anniversaire formule vous indique simplement à quel point vous avez besoin pour commencer à nous inquiéter d'une collision se produise. C'est autour de
Sqrt[n]
oùn
est le nombre total de possible des valeurs de hachage. Dans ce casn = 2^64
donc le Paradoxe d'Anniversaire formule qui vous dit que tant que le nombre de touches est beaucoup moins queSqrt[n] = Sqrt[2^64] = 2^32
soit environ 4 milliards de dollars, vous n'avez pas besoin de vous soucier de collisions. Plus len
plus la précision de cette estimation. En fait, la probabilitép(k)
qu'une collision se produira aveck
clés de l'approche d'une étape de la fonction en tant quen
devient plus grand, où l'étape se produit àk=Sqrt[n]
.En supposant que la fonction de hachage est distribuée de manière uniforme, il est simple à obtenir la formule.
Que la formule suit directement à partir de départ avec 1 clé: La probabilité de l'absence de collision avec 1 clé est bien sûr 1. La probabilité de l'absence de collision avec les touches 2 est
1 * (n-1)/n
. Et ainsi de suite pour tous lesk
clés. Idéalement, Mathematica a un De Pochhammer[]à cet effet, pour l'exprimer de manière succincte:Ensuite, pour calculer la probabilité qu'il y ait au moins 1 collision pour
k
clés, de la soustraire 1:À l'aide de Mathematica, on peut calculer pour
n=2^64
:Pour répondre à cette précision dépend de la probabilité que 2 des 10 000 clés ont été identiques. Ce que nous recherchons est:
où
a
etb
sont les clés (éventuellement identiques) eth()
est la fonction de hachage. Nous pouvons appliquer Le Théorème De Bayes directement:On voit immédiatement que
p(h(a)=h(b)|a=b) = 1
(sia=b
puis, bien sûr,h(a)=h(b)
) nous obtenons doncComme vous pouvez le voir cela dépend
p(a=b)
qui est la probabilité quea
etb
sont en fait la même clé. Cela dépend de la façon dont le groupe de 10 000 clés ont été sélectionnés dans la première place. Les calculs pour les deux questions précédentes assumer toutes les touches sont distinctes, donc, plus d'informations sur ce scénario est nécessaire pour répondre complètement à la question.Voir: Attaque d'anniversaire.
En supposant que la distribution des hachages est uniforme, la probabilité de collision pour
n
clés est d'environ n2/265.C'est seulement en sécurité lorsque vous utilisez une fonction de hachage cryptographique. Même si vous pouvez tolérer une faute tous les 3*1011 fois, vous pourriez avoir à envisager la possibilité que l'entrée est spécifiquement construit pour créer un hash collision, comme une attaque de votre programme.
Je vais vous donner une approximation pour les formules exactes fournies dans les autres réponses, le rapprochement peut être en mesure pour vous aider à répondre #3. L'approximation est que la probabilité de collision avec les touches k et n possible des valeurs de hachage avec un bon algorithme de hachage est d'environ (k^2)/2n, pour k << n. Pour 100,000 clés avec une version 64 bits de hachage, c'est 10^10 /32x10^18 ans ou environ 1 à 3 milliards de dollars.
Cependant, je soupçonne que si vous y allez avec pas de vérifier les réelles valeurs de la clé de la collision, il ya une grande chance que vous allez trouver l'algorithme de hachage n'est pas "bon" assez, après tout.
La probabilité d'une seule collision dépend de l'ensemble de clés générée par la fonction de hachage est uniforme, nous pouvons faire à la suite de calculer la probabilité que la collision ne se produit lors de la génération de k touches comme suit :-
Donc si
sqrt(2^64)
clés de2^32
clés sont générées il n'y a plus de chance qu'il y est une seule collision.C'est une question très intéressante, car elle dépend de la taille de l'espace des clés. Supposons que vos clés sont générés de façon aléatoire à partir de l'espace de
size = s
de hachage et de l'espace estx=2^64
comme vous l'avez mentionné. La probabilité de collision estPc(k=n|x) = 1-e^(-n^2)/2x
. Si la Probabilité de choisir le même clé dans la clé de l'espace estP(k=n|s) = 1-e^(-n^2)/2s
. Pour être sûr que si le hachage est de même sur les touches sont les mêmes:-Par conséquent, il montre que pour les clés pour être de la même si de hachage est le même que l'ensemble de clés de taille doit être plus petit
2^64
env sinon il existe un risque de collision de hachage plus que dans un jeu de clés. Le résultat est indépendant du nombre de clés générées.