6 Caractère Court Algorithme De Hachage
Mon objectif est de générer un court de Hachage chaîne de 6 caractères (contenant éventuellement des caractères [A-Z][a-z][0-9]) pour une chaîne qui est 42 de la casse des caractères alphanumériques de longueur. L'unicité est l'exigence clé. De sécurité ou de performance n'est pas si important.
Est-il un algorithme spécifique qui permettra de donner à ce résultat ou dois-je en tenir à la troncature d'un Hachage MD5 ou SHA-1 Hash (Comme dans cette question)? Si oui, quelle est la probabilité de collision?
string.GetHash()
?J'ai essayé cette, chaîne sourceString = "SomeTestStringWhichIs42Charactersinlength!"; Console.WriteLine(sourceString.GetHashCode().ToString("X6")); Elle renvoie à 8 Caractères.
Comment pouvez-vous générer un unique de 6 caractères de hachage pour un 42 caractères chaîne de caractères?
Avec vos limites, vous pouvez (au mieux) de hachage 62^6 numéros sans collision. Bien qu'après le malaxage de la moitié de celle de nombreux, vous aurez 50% de chance de collision (au mieux). Dépend des données de hachage et l'algorithme de hachage. Certains algorithmes faire mieux avec différents ensembles de données
OriginalL'auteur Isuru | 2013-08-27
Vous devez vous connecter pour publier un commentaire.
Votre meilleur pari serait de la troncature bien connus fonction de hachage (MD5 ou SHA-famille), car ces algorithmes ont statistiquement bon uniforme des distributions des valeurs de hachage (et également l'utilisation complète de hachage et pas seulement de 6 caractères).
Maintenant quelques calculs de la probabilité de collision
Maintenant, nous allons voir le résultat de la table pour un certain nombre d'éléments dans un tableau - K
Cette formule ne peut être utilisée pour les petits K, mais il montre que, compte tenu de 100K entrées dans la table de hachage, vous serait à peu près de 17% de chance de collision.
Liens
La probabilité de Collision
OriginalL'auteur oleksii
Facile de hachage 🙂
hash[i % 6] ^ str[i]
. OP membres de la chaîne d'entrée est le cas insensative, pour les deux a-z et A-Z le plus élevé des deux bits sont les mêmes pour tous les personnages. Même si vous avez utilisé tous les caractères ASCII imprimables (0x20-0x7e) les deux premiers bits sont toujours identiques pour 66% de l'ensemble des caractères.S'adapte Parfaitement pour moi. J'ai dû générer une couleur basée sur un nom et d'un diplôme d'éléments imbriqués. jsfiddle.net/fgg8xx2k exemple est écrit en caractères d'imprimerie
OriginalL'auteur Viacheslav Smityukh
La meilleure solution est presque certainement utiliser SHA1, convertir Base62 (bien que Base64 serait beaucoup plus facile, car elle est intégrée dans le cadre Convertir des.ToBase64String. Vous devrez faire de la recherche d'une vie décente Base62 bibliothèque), puis tronquer la sortie à 6 octets.
Je ne voudrais pas utiliser
GetHashCode()
car elle a un histoire de problèmes de collision. (Je ne suis pas en train de prétendre que ce bug s'appliquerait à vous, le seul fait de mentionner cela comme une preuve queGetHashCode
n'a pas été mis en œuvre dans le passé.)Je voudrais aussi ne pas mettre en œuvre une coutume algorithme de hachage, il est extrêmement facile à accidentellement écrire un algorithme avec un haut taux de collision. Beaucoup de la recherche et de l'examen a traversé SHA1 et les autres principaux algorithmes de hachage, et vous seriez très difficile de trouver quelque chose de mieux.
OriginalL'auteur Syon