10
votes

Afficher un GUID en 36 lettres Format

GUID est un grand nombre aléatoire Afficher dans un hex . Je souhaite montrer ce numéro dans un format plus court, disons que sur la base de toutes les lettres et numéros. C'est une base de 36 ans.

permet de dire que: 2f1e4fc0-81fd-11da-9156-00036a0f876a deviendra comme 3jel9x6ezi . .

Y a-t-il un algorithme "prêt" pour cela dans .NET?

Il doit être bidirectionnel.

edit: en utilisant base64 est une solution encore meilleure. Le seul problème est de base64 contient / de caractère qui n'est pas compatible à utiliser dans URI .


2 commentaires

Pour la base 64, vous pouvez substituer des caractères non valides avec ceux valides (mais pas déjà utilisés). IIRC, il y a un peu moins de 96 caractères ASCII imprimables.


Regardez ma réponse pour voir comment j'ai réparé le ==, / et + problème


5 Réponses :


1
votes

base64 est ce que j'utilise, Ce corrigera le problème avec == et / et +


0 commentaires

2
votes

Ce n'est pas possible comme vous l'avez présenté. Vous devriez perdre des informations:

>>> 16 ** len('2f1e4fc081fd11da915600036a0f876a')
340282366920938463463374607431768211456
>>> 36 ** len('3jEl9x6eZi')
3656158440062976


1 commentaires

La valeur 3JEL9X6EZI est uniquement par exemple, et il n'est pas une valeur "réelle".



1
votes

Je pense que le plus proche que vous trouverez est base36 mais cela ne fonctionnera pas avec un type de giud (seulement un INT16, INT32 ou INT64).


0 commentaires

8
votes

Il n'y a rien de construit pour une telle conversion. Quelque chose de fermeture qui est intégré consiste à utiliser la base 64 coding: xxx


2 commentaires

Bonne solution. Mais pourquoi chaque chaîne se termine avec '=='? = Ce n'est pas une valeur valide au format BASE64.


@Mendy: Le caractère = est utilisé pour remplir le dernier groupe de caractères. (Il est spécifié dans la norme RFC 1421.)



13
votes

Peut-être que c'est ce dont vous avez besoin: ShortGuid - une classe GUID amicale plus courte et une URL en C #


0 commentaires