La Base de 62 conversion
Comment voulez-vous convertir un nombre entier en base 62 (comme hexadécimal, mais avec ces chiffres: '0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz').
J'ai essayé de trouver une bonne bibliothèque Python pour elle, mais ils ont tous semble être occupé avec la conversion de chaînes de caractères. Le Python base64 module accepte uniquement les chaînes, et tourne à un seul chiffre en quatre caractères. Je cherchais quelque chose de semblable à ce que des raccourcisseurs d'URL à utiliser.
- Sonne comme quelqu'un vient de trouver un projet open source idée 🙂 Laissez-moi savoir si vous trouvez quelque chose ou décidez de créer votre propre...
- Si vous souhaitez créer une Url courte, vous pouvez utiliser l'ensemble des caractères qui n'ont pas besoin d'être codé: en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters. C'est de 66 caractères.
- Je pense que je vais passer sur la dot et le tilde, juste pour éviter la confusion des utilisateurs, mais le tableau de bord et la souligne devrait être la peine d'ajouts, merci.
- qu'en Base64? Vous pourriez avoir plus de chance de trouver des bibliothèques pour que.
- Cette question a un certain nombre de réponses: stackoverflow.com/questions/561486/...
- Cooper: Base 64 n'est pas optimisé pour les nombres, et donc pas vraiment applicable pour ce cas d'utilisation. @Miles: Oui, la baseconverter classe que Simon Willison publié sur djangosnippets.org/snippets/1431 semble comme un concurrent digne de. Je pourrais faire un test peu de temps pour trouver la plus efficace 🙂
- J'ai une bibliothèque Python pour exactement ce que fait ici: http://www.djangosnippets.org/snippets/1431/
- Si vous tentez d'écrire un raccourcisseur d'URL, code.google.com/p/python-mom/source/browse/mom/codec/base58.py fournit une assez bonne mise en œuvre d'un base58 codec qui fonctionne avec Python 2.5+ et Python 3.0. Il est tout à fait un peu de documentation en y expliquant pourquoi base58 est approprié. Espérons que cette aide.
- J'ai fait mon js version dans un projet open source, check it out: github.com/sbussard/encode-the-things
- double possible de Est-il une bonne bibliothèque python qui permet de transformer les nombres dans leur "symboles"?
- Cela peut vous aider: github.com/suminb/base62
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de module standard pour cela, mais j'ai écrit mes propres fonctions pour y parvenir.
Avis le fait que vous pouvez lui donner tout l'alphabet à utiliser pour l'encodage et le décodage. Si vous laissez le
alphabet
argument, vous allez obtenir de l'62 caractères de l'alphabet définies sur la première ligne de code, et donc de l'encodage/décodage/à partir de 62 de la base.Espère que cette aide.
PS - Pour les raccourcisseurs d'URL, j'ai trouvé qu'il est préférable de laisser un peu de confusion des personnages comme 0Ol1oI etc. J'ai donc utiliser cet alphabet pour mon raccourcissement d'URL besoins
"23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"
Avoir du plaisir.
$-_.+!*'(),;/?:@&=
Vous pouvez probablement utiliser d'autres caractères, comme trop[]~
etc.ceil( ln(2^31)/ln(62) ) == 6
Quand vous allez à décoder plus de 6 caractères, vous rencontrerez un dépassement de capacité. Je n'ai pas essayé une mise en œuvre sans cette limitation, mais je suis sûr que c'est possible.-
caractère).'A' < 'a'
). Si vous souhaitez conserver l'ordre alphabétique entre votre chaîne d'origine et votre chaîne codée, cet alphabet est mieux :"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
decode('0') == decode('00000')
codecs
Une fois, j'ai écrit un script pour cela aussi, je pense que c'est très élégant 🙂
Exemple d'utilisation:
reversed(string)
plus rapide que le tranchagestring[::-1]
dans le base_decode fonction.La suite du décodeur maker est compatible avec la toute base raisonnable, est beaucoup plus propre de la boucle, et donne un message d'erreur explicite quand il rencontre un caractère non valide.
**
opérateur dans la boucle.Si vous êtes à la recherche de la plus grande efficacité (comme django), vous aurez envie de 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 d'une chaîne de montre avec plus d'efficacité que une liste, même avec de très longs nombres.)
Codé et décodé 1 millions de numéros en moins de 2,5 secondes. (2.2 Ghz i7-2670QM)
tuple()
autour deBASE_ALPH
au début. En Python chaque Chaîne est itératif. Cette fonctionnalité est bien sûr exploitée parenumerate()
. Si le code est encore plus maigre 🙂Vous voulez probablement base64, pas base62. Il y a une URL de la version de compatible avec flottant autour, de sorte que les deux caractères de remplissage ne devrait pas être un problème.
Le processus est assez simple; considère que base64 représente 6 bits et d'octets, ne représente que 8. Affecter une valeur à partir de 000000 à 111111 pour chacun des 64 caractères choisis, et mettre les 4 valeurs pour correspondre à un ensemble de 3 base256 octets. Répétez l'opération pour chaque ensemble de 3 octets, rembourrage à la fin avec votre choix de rembourrage personnage (0 est généralement utile).
Si vous avez besoin de générer un numéro court (puisque vous parlez de raccourcisseurs d'URL) plutôt que de coder/décoder quelque chose, ce module pourrait aider:
https://github.com/stochastic-technologies/shortuuid/
vous pouvez télécharger zbase62 module de pypi
par exemple
J'ai grandement bénéficié de posts des autres ici. J'ai besoin du code python à l'origine pour un projet Django, mais depuis, j'ai tourné à node.js, voici donc un version javascript du code (le codage) que Baishampayan Ghose fourni.
J'espère que le fragment de code suivant pourrait vous aider.
D'utilisation pour votre cas:
Évidemment, vous pouvez spécifier un autre alphabet, composé de plus ou moins grand nombre de symboles, puis il vous permet de convertir votre numéro de téléphone sur le plus ou moins grand nombre de la base. Par exemple, '01', comme un alphabet de sortie de chaîne de caractères représentant le numéro d'entrée binaire.
Vous pouvez shuffle l'alphabet d'abord avoir votre unique de représentation des nombres. Il peut être utile si vous faites le raccourcisseur d'URL de service.
if num < 0 or type(num) not in (int, long):
.long
n'existe pas dans Py 3.x -- de sorte que l'on peut vouloir utiliser les cette réponse.isinstance(x, (type(1), type(2**32)))
.Voici ma solution:
explication
Dans toute la base de chaque nombre est égal à
a1+a2*base**2+a3*base**3...
Donc le but est de trouver tous lesa
s.Pour chaque
N=1,2,3...
le code isole leaN*base**N
par "moduloing" parb
pourb=base**(N+1)
les tranches qui tousa
s plus grand queN
, et de trancher tous lesa
s de sorte que leur numéro de série est plus petit queN
par la diminution dea
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
avec une seule exception, lorsqueq==base-1
qui renvoie0
. Pour résoudre ce cas, il renvoie0
. La fonction vérifie pour0
depuis le début.avantages
Dans cet exemple il n'y a qu'une multiplication (au lieu d'une division) et certains le module opérations, qui sont tous relativement rapide.
Si vous utilisez le framework django, vous pouvez utiliser django.utils.baseconv module.
En plus de base62, baseconv également défini base2/base16/base36/base56/base64.
Personnellement, j'aime bien la solution de Baishampayan, principalement parce que le décapage de la confusion des personnages.
De l'exhaustivité et de la solution avec de meilleures performances, ce post montre une façon d'utiliser le Python base64 module.
J'ai écrit ce un temps, et c'est assez bien travaillé (négatifs et tout inclus)
désolé pour la longueur de tout
Voici un recurive et de façon itérative pour le faire. L'itératif est un peu plus rapide en fonction sur le compte de l'exécution.
Il y a maintenant une bibliothèque python pour cela.
Je travaille sur la réalisation d'une pip paquet pour cette.
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 quelles bases sont utilisables
Désolé, je ne peux pas vous aider avec une bibliothèque ici. Je préfère utiliser base64 et juste en ajoutant à des caractères supplémentaires pour votre choix, si possible!
Ensuite, vous pouvez utiliser le base64 module.
Si c'est vraiment, vraiment pas possible:
Vous pouvez le faire vous-même de cette façon (c'est un pseudo-code):