Comment convertiriez-vous un entier en base 62 (comme hexadécimal, mais avec ces chiffres: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ').
J'ai essayé de trouver une bonne bibliothèque Python pour cela, mais elles semblent toutes être occupées à convertir des chaînes. Le module Python base64 n'accepte que les chaînes et transforme un seul chiffre en quatre caractères. Je cherchais quelque chose qui ressemble à ce que les raccourcisseurs d'URL utilisent.
Réponses:
Il n'y a pas de module standard pour cela, mais j'ai écrit mes propres fonctions pour y parvenir.
Notez le fait que vous pouvez lui donner n'importe quel alphabet à utiliser pour l'encodage et le décodage. Si vous laissez l'
alphabet
argument de côté, vous obtiendrez l'alphabet de 62 caractères défini sur la première ligne de code, et donc l'encodage / décodage vers / à partir de 62 base.J'espère que cela t'aides.
PS - Pour les raccourcisseurs d'URL, j'ai trouvé qu'il vaut mieux laisser de côté quelques caractères déroutants comme 0Ol1oI etc. Ainsi j'utilise cet alphabet pour mes besoins de raccourcissement d'URL -
"23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
S'amuser.
la source
$-_.+!*'(),;/?:@&=
Vous pouvez probablement utiliser d'autres caractères comme[]~
etc.Une fois, j'ai écrit un script pour faire cela aussi, je pense que c'est assez élégant :)
Exemple d'utilisation:
la source
reversed(string)
plus rapidement que le découpagestring[::-1]
dans la fonction base_decode.integer /= length
pourinteger //=length
obtenir le reste correctLe décodeur-fabricant suivant fonctionne avec n'importe quelle base raisonnable, a une boucle beaucoup plus ordonnée et donne un message d'erreur explicite lorsqu'il rencontre un caractère invalide.
la source
**
opérateur dans la boucle.Si vous recherchez la plus grande efficacité (comme django), vous voudrez quelque chose comme ce qui suit. Ce code est une combinaison de méthodes efficaces de Baishampayan Ghose et WoLpH et John Machin.
Vous pouvez également calculer votre dictionnaire à l'avance. (Remarque: l'encodage avec une chaîne est plus efficace qu'avec une liste, même avec des nombres très longs.)
Encodé et décodé 1 million de nombres en moins de 2,5 secondes. (2,2 GHz i7-2670QM)
la source
tuple()
qui se passeBASE_ALPH
au début. En Python, chaque chaîne est itérable. Cette fonctionnalité est bien sûr exploitée parenumerate()
. Le code devient donc encore plus léger :)Si vous utilisez le framework django, vous pouvez utiliser le module django.utils.baseconv.
En plus de base62, baseconv a également défini base2 / base16 / base36 / base56 / base64.
la source
Vous voulez probablement base64, pas base62. Il existe une version compatible URL de celui-ci flottant, donc les deux caractères de remplissage supplémentaires ne devraient pas poser de problème.
Le processus est assez simple; considérez que base64 représente 6 bits et un octet régulier représente 8. Attribuez une valeur de 000000 à 111111 à chacun des 64 caractères choisis, et mettez les 4 valeurs ensemble pour correspondre à un ensemble de 3 base256 octets. Répétez pour chaque ensemble de 3 octets, en remplissant à la fin votre choix de caractère de remplissage (0 est généralement utile).
la source
Si tout ce dont vous avez besoin est de générer un identifiant court (puisque vous mentionnez des raccourcisseurs d'URL) plutôt que d'encoder / décoder quelque chose, ce module peut vous aider:
https://github.com/stochastic-technologies/shortuuid/
la source
vous pouvez télécharger le module zbase62 depuis pypi
par exemple
la source
J'ai beaucoup profité des publications des autres ici. J'avais besoin du code python à l'origine pour un projet Django, mais depuis, je me suis tourné vers node.js, voici donc une version javascript du code (la partie encodage) que Baishampayan Ghose a fourni.
la source
J'espère que l'extrait suivant pourra vous aider.
Utilisation pour votre cas:
Évidemment, vous pouvez spécifier un autre alphabet, composé d'un nombre inférieur ou supérieur de symboles, puis il convertira votre nombre en base numérique inférieure ou supérieure. Par exemple, fournir «01» comme alphabet produira une chaîne représentant le nombre d'entrée sous forme de binaire.
Vous pouvez d'abord mélanger l'alphabet pour avoir votre représentation unique des nombres. Cela peut être utile si vous créez un service de raccourcissement d'URL.
la source
if num < 0 or type(num) not in (int, long):
.long
n'existe pas dans Py 3.x - on pourrait donc vouloir utiliser cette réponse .isinstance(x, (type(1), type(2**32)))
.Il existe maintenant une bibliothèque python pour cela.
Je travaille sur la création d'un package pip pour cela.
Je vous recommande d'utiliser mon bases.py https://github.com/kamijoutouma/bases.py qui a été inspiré par bases.js
reportez-vous à https://github.com/kamijoutouma/bases.py#known-basesalphabets pour connaître les bases utilisables
la source
Voici ma solution:
explication
Dans n'importe quelle base, chaque nombre est égal à
a1+a2*base**2+a3*base**3...
Donc le but est de trouver tous lesa
s.Pour tout
N=1,2,3...
le code isole leaN*base**N
en "modulant" parb
pourb=base**(N+1)
quelles tranches tous lesa
s plus grands queN
, et en découpant tous lesa
s pour que leur série soit plus petite qu'enN
diminuant àa
chaque fois que la fonction est appelée récursivement par le courantaN*base**N
.Base%(base-1)==1
doncbase**p%(base-1)==1
et doncq*base^p%(base-1)==q
à une seule exception, quandq==base-1
qui revient0
. Pour résoudre ce cas, il revient0
. La fonction vérifie0
depuis le début.avantages
Dans cet exemple, il n'y a qu'une seule multiplication (au lieu d'une division) et quelques opérations de module, qui sont toutes relativement rapides.
la source
Personnellement, j'aime la solution de Baishampayan, principalement à cause du décapage des personnages déroutants.
Pour être complet et pour une solution avec de meilleures performances, cet article montre un moyen d'utiliser le module Python base64.
la source
J'ai écrit ceci il y a quelque temps et ça a plutôt bien fonctionné (négatifs et tout inclus)
désolé pour la durée de tout ça
la source
la source
Voici une façon récurrente et itérative de le faire. L'itératif est un peu plus rapide en fonction du nombre d'exécutions.
la source
Python
3.7.x
J'ai trouvé un github de doctorat pour certains algorithmes lors de la recherche d'un script base62 existant . Cela ne fonctionnait pas pour la version max actuelle de Python 3 à ce moment-là, je suis donc allé de l'avant et j'ai corrigé le cas échéant et fait un peu de refactorisation. Je ne travaille généralement pas avec Python et je l'ai toujours utilisé ad hoc donc YMMV. Tout le mérite revient au Dr Zhihua Lai . Je viens de résoudre les problèmes de cette version de Python.
fichier
base62.py
fichier
try_base62.py
sortie de
try_base62.py
Puisqu'il n'y avait aucune information de licence dans le repo, j'ai soumis un PR afin que l'auteur original sache au moins que d'autres personnes utilisent et modifient leur code.
la source
Désolé, je ne peux pas vous aider avec une bibliothèque ici. Je préférerais utiliser base64 et simplement ajouter des caractères supplémentaires à votre choix - si possible!
Ensuite, vous pouvez utiliser le module base64.
Si ce n'est vraiment, vraiment pas possible:
Vous pouvez le faire vous-même de cette façon (c'est un pseudo-code):
la source
avec récursion simple
la source
Le plus simple jamais.
la source