2010-07-29 8 views
1

J'ai conçu une interface utilisateur pour un outil où l'utilisateur doit entrer un "Nom" d'une longueur maximale de 300 caractères, et l'outil génère un fichier texte ("Name" .txt) qui est ensuite téléchargé sur un "serveur" (Mainframe et Unix). Je veux raccourcir la chaîne de 300 caractères en une chaîne de 8 caractères identifiables de manière unique (à cause de problèmes principalement dans le mainframe), quelque chose comme un tinyurl utilisant une sorte d'algorithme de hachage. J'ai trouvé une implémentation SHA1 mais la chaîne résultante a une longueur de 40 caractères. Quelqu'un peut-il suggérer une implémentation VBA pour l'algorithme? L'exigence de la chaîne résultante étant de 8 caractères est stricte - je suppose qu'elle devrait être faisable étant donné que nous avons une limitation sur la taille de la chaîne d'entrée.Convertir une chaîne de 300 caractères en une chaîne de 8 caractères identifiables de manière unique dans VBA

Répondre

1

Je pense que l'idée de Jens devrait fonctionner très bien. Si vous ne voulez pas tronquer le hachage SHA-1, vous pouvez utiliser un CRC-32 (32 bits ~ 8 caractères ascii de 0..f). (vous pouvez essayer d'utiliser this example) CRC-32 est moins sûr en ce qui concerne les collisions, mais c'est à vous de décider.

3

Vous pouvez simplement prendre les huit premiers caractères du SHA1 Hash.

Ces hachages (comme la version originale de 40 caractères) ne sont pas garantis d'être uniques, cependant. Si vous avez besoin de l'unicité, vous devez probablement stocker chaque nom avec sa version courte quelque part et n'émettre que des noms courts non utilisés jusqu'à présent. (C'est ce que fait tinyurl.)

+0

Bien que je n'ai aucune idée des mathématiques statistiques impliquées, mais simplement couper les huit premiers caractères augmentera le risque de collisions grandement. – MvanGeest

+1

@MvanGeest: Oui, ce sera le cas, mais cela pourrait être encore suffisant. Si vous prenez 8 caractères d'un hachage codé en base64, vous avez 64^8 = 2,8E14 combinaisons différentes. Si les hashes sont assez aléatoires, les chances d'une collision atteignent 50% à environ 20 millions d'entrées, avec 2 millions d'entrées vous avez moins de 1% de chance. – Jens

Questions connexes