Nous savons tous à quoi ressemble un hachage, mais vous êtes-vous déjà demandé à quelle fréquence un personnage particulier apparaît dans un hachage? Me suis-je demandé. Et j'ai décidé de vérifier. Esquissé un script Python pour compter, et voici ce qui en est ressorti.
Tout d'abord, j'ai généré une chaîne aléatoire de caractères (longueur de 0 à 1000).
def random_string(from_int, to_int): return str(''.join(random.SystemRandom().choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(random.randint(from_int, to_int))))
Ensuite, j'ai pris le hachage MD5 de la chaîne.
def md5_from_string(string): return hashlib.md5(string.encode('utf-8')).hexdigest()
Après - j'ai calculé le nombre de chiffres de 0 à 9 dans le hachage. Sur un échantillon de 1000 hachages, j'ai reçu les données suivantes:

Ici, la différence entre le chiffre le plus fréquemment rencontré et le plus rare (valeur delta) est intéressante.

De plus, afin de suivre l'évolution de la valeur delta, il a fait des échantillons de 10 000, 100 000, 1 000 000, 10 000 000 de hachages.

Ce qui suit est une liste avec les valeurs des nombres minimum et maximum et la valeur delta sur les échantillons avec différents nombres de hachages MD5:
- 100 - min: 179, max: 230, delta: 22,17%
- 1000 - min: 1925, max: 2058, delta: 6,46%
- 10000 - min: 19769, max: 20251, delta: 2,38%
- 100000 - min: 199297, max: 200846, delta: 0,77%
- 1000000 - min: 1997650, max: 2001690, delta: 0,20%
- 10000000 - min: 19991830, max: 20004818, delta: 0,06%
Ce que nous avons: avec une augmentation du nombre de hachages dans le tableau, la valeur delta diminue et tout chiffre avec presque la même probabilité tombera dans le tableau. Ainsi, plus l'échantillon est grand, plus la différence entre les nombres fréquemment rencontrés et rarement observés est faible. Par conséquent, la probabilité d'obtenir un chiffre particulier dans un hachage tend à l'uniformité.
Ces informations ont constitué la base de l'algorithme que nous avons implémenté sur la
plateforme de compétition
bepeam.com