Existe-t-il un moyen de chiffrement qui peut prendre une chaîne de n'importe quelle longueur et produire un hachage de moins de 10 caractères? Je souhaite produire des identifiants raisonnablement uniques mais basés sur le contenu du message, plutôt que de manière aléatoire.
Je peux vivre en limitant les messages à des valeurs entières, si les chaînes de longueur arbitraire sont impossibles. Cependant, le hachage ne doit pas être similaire pour deux entiers consécutifs, dans ce cas.
encryption
uniqueidentifier
rath3r
la source
la source
Réponses:
Vous pouvez utiliser n'importe quel algorithme de hachage couramment disponible (par exemple SHA-1), ce qui vous donnera un résultat légèrement plus long que ce dont vous avez besoin. Tronquez simplement le résultat à la longueur souhaitée, ce qui peut être suffisant.
Par exemple, en Python:
la source
hash(a)
entre en collision avec,hash(b)
ilbase64(hash(a))
entre également en collision avecbase64(hash(b))
.sha1
collisions mais c'est une autre histoire). Si vous avez un hachage de 10 caractères, vous obtenez une entropie plus élevée s'il est encodé avecbase64
vsbase16
(ou hex). Combien plus haut? Avecbase16
vous obtenez 4 bits d'informations par caractère, avecbase64
ce chiffre est de 6 bits / caractère. Au total, un hachage "hexadécimal" de 10 caractères aura 40 bits d'entropie tandis qu'un base64 60 bits. C'est donc un peu plus résistant, désolé si je n'étais pas super clair.Si vous n'avez pas besoin d'un algorithme résistant aux modifications intentionnelles, j'ai trouvé un algorithme appelé adler32 qui produit des résultats assez courts (~ 8 caractères). Choisissez-le dans le menu déroulant ici pour l'essayer:
http://www.sha1-online.com/
la source
Vous devez hacher le contenu pour créer un condensé. Il existe de nombreux hachages disponibles, mais 10 caractères sont assez petits pour le jeu de résultats. Il y a longtemps, les gens utilisaient CRC-32, qui produit un hachage de 33 bits (essentiellement 4 caractères plus un bit). Il existe également CRC-64 qui produit un hachage de 65 bits. MD5, qui produit un hachage de 128 bits (16 octets / caractères) est considéré comme cassé à des fins cryptographiques car deux messages peuvent être trouvés qui ont le même hachage. Il va sans dire que chaque fois que vous créez un condensé de 16 octets à partir d'un message de longueur arbitraire, vous allez vous retrouver avec des doublons. Plus le résumé est court, plus le risque de collision est grand.
Cependant, votre souci que le hachage ne soit pas similaire pour deux messages consécutifs (entiers ou non) devrait être vrai avec tous les hachages. Même un simple changement dans le message d'origine devrait produire un résumé résultant très différent.
Donc, utiliser quelque chose comme CRC-64 (et base-64 pour le résultat) devrait vous amener dans le quartier que vous recherchez.
la source
Je résume juste une réponse qui m'a été utile (en notant le commentaire de @ erasmospunk sur l'utilisation de l'encodage en base 64). Mon objectif était d'avoir une corde courte qui était surtout unique ...
Je ne suis pas un expert, veuillez donc corriger cela s'il y a des erreurs flagrantes (en Python encore une fois comme la réponse acceptée):
Le
result
ici utilise plus que de simples caractères hexadécimaux (ce que vous obtiendriez si vous les utilisiezhash.hexdigest()
), il est donc moins susceptible d'avoir une collision (c'est-à-dire qu'il devrait être plus sûr de tronquer qu'un condensé hexadécimal).Remarque: Utilisation de UUID4 (aléatoire). Voir http://en.wikipedia.org/wiki/Universally_unique_identifier pour les autres types.
la source
Vous pouvez utiliser un algorithme de hachage existant qui produit quelque chose de court, comme MD5 (128 bits) ou SHA1 (160). Ensuite, vous pouvez raccourcir cela davantage en XORing des sections du résumé avec d'autres sections. Cela augmentera le risque de collision, mais pas aussi grave que de simplement tronquer le résumé.
En outre, vous pouvez inclure la longueur des données d'origine dans le cadre du résultat pour le rendre plus unique. Par exemple, XORing de la première moitié d'un condensé MD5 avec la seconde moitié donnerait 64 bits. Ajoutez 32 bits pour la longueur des données (ou moins si vous savez que la longueur tiendra toujours dans moins de bits). Cela entraînerait un résultat de 96 bits (12 octets) que vous pourriez ensuite transformer en une chaîne hexadécimale de 24 caractères. Vous pouvez également utiliser le codage base 64 pour le rendre encore plus court.
la source
Si vous avez besoin,
"sub-10-character hash"
vous pouvez utiliser l' algorithme Fletcher-32 qui produit un hachage de 8 caractères (32 bits), CRC-32 ou Adler-32 .CRC-32 est plus lent que Adler32 d'un facteur de 20% à 100%.
Fletcher-32 est légèrement plus fiable que Adler-32. Il a un coût de calcul inférieur à celui de la somme de contrôle Adler: comparaison Fletcher vs Adler .
Un exemple de programme avec quelques implémentations Fletcher est donné ci-dessous:
Production:
D'accord avec les vecteurs de test :
Adler-32 a un faible pour les messages courts de quelques centaines d'octets, car les sommes de contrôle de ces messages ont une mauvaise couverture des 32 bits disponibles. Vérifie ça:
L'algorithme Adler32 n'est pas assez complexe pour rivaliser avec des sommes de contrôle comparables .
la source
Exécutez simplement ceci dans un terminal (sur MacOS ou Linux):
8 caractères de long.
la source
Vous pouvez utiliser la bibliothèque hashlib pour Python. Les algorithmes shake_128 et shake_256 fournissent des hachages de longueur variable. Voici un code de travail (Python3):
Notez qu'avec un paramètre de longueur x (5 dans l'exemple), la fonction renvoie une valeur de hachage de longueur 2x .
la source
Nous sommes maintenant en 2019 et il existe de meilleures options. À savoir, xxhash .
la source
J'avais récemment besoin de quelque chose du genre d'une simple fonction de réduction de chaîne. Fondamentalement, le code ressemblait à ceci (code C / C ++ à venir):
Il a probablement plus de collisions qu'on ne le souhaiterait, mais il n'est pas destiné à être utilisé comme fonction de hachage cryptographique. Vous pouvez essayer différents multiplicateurs (c'est-à-dire changer le 37 en un autre nombre premier) si vous obtenez trop de collisions. L'une des caractéristiques intéressantes de cet extrait de code est que lorsque Src est plus court que Dest, Dest se retrouve avec la chaîne d'entrée telle quelle (0 * 37 + valeur = valeur). Si vous voulez quelque chose de "lisible" à la fin du processus, Normaliser ajustera les octets transformés au prix d'une augmentation des collisions.
La source:
https://github.com/cubiclesoft/cross-platform-cpp/blob/master/sync/sync_util.cpp
la source
DestSize
plus de 4 (32 bits) lorsque le hachage lui - même est si merdique? Si vous vouliez la résistance aux collisions fournie par une sortie plus grande qu'un int, vous utiliseriez SHA.