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, WoLpH et John Machin.
# Edit this list of characters as desired.
BASE_ALPH = tuple("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
BASE_DICT = dict((c, v) for v, c in enumerate(BASE_ALPH))
BASE_LEN = len(BASE_ALPH)
def base_decode(string):
num = 0
for char in string:
num = num * BASE_LEN + BASE_DICT[char]
return num
def base_encode(num):
if not num:
return BASE_ALPH[0]
encoding = ""
while num:
num, rem = divmod(num, BASE_LEN)
encoding = BASE_ALPH[rem] + encoding
return encoding
Vous pouvez également calculer votre dictionnaire à l'avance. (Note : L'encodage avec une chaîne de caractères montre plus d'efficacité qu'avec une liste, même avec des nombres très longs).
>>> timeit.timeit("for i in xrange(1000000): base.base_decode(base.base_encode(i))", setup="import base", number=1)
2.3302059173583984
Encodage et décodage d'un million de chiffres en moins de 2,5 secondes. (2.2Ghz i7-2670QM)
0 votes
On dirait que quelqu'un vient de trouver une idée de projet open source :) Faites-moi savoir si vous trouvez quelque chose ou si vous décidez de créer le vôtre...
1 votes
Si vous souhaitez créer des URL courtes, vous pouvez utiliser l'ensemble des caractères qui n'ont pas besoin d'être codés : fr.wikipedia.org/wiki/Percent-encoding#Types_de_caractères_URI . Cela fait 66 caractères.
0 votes
Je pense que je vais passer sur le point et le tilde, juste pour éviter la confusion des utilisateurs, mais le tiret et les underscores devraient être des ajouts intéressants, merci.
0 votes
Qu'en est-il de Base64 ? Vous aurez peut-être plus de chance en trouvant des bibliothèques pour cela.
0 votes
Cette question a plusieurs réponses possibles : stackoverflow.com/questions/561486/
0 votes
@Mike Cooper : La base 64 n'est pas optimisée pour les nombres, et donc pas vraiment applicable pour ce cas d'utilisation. @Miles : Oui, la classe baseconverter que Simon Willison a postée à l'adresse suivante djangosnippets.org/snippets/1431 semble être un concurrent digne de ce nom. Je pourrais faire un benchmark un jour pour trouver le plus efficace :)
0 votes
J'ai une bibliothèque Python pour faire exactement cela ici : http://www.djangosnippets.org/snippets/1431/
0 votes
Si vous essayez d'écrire un raccourcisseur d'URL, code.google.com/p/python-mom/source/browse/mom/codec/base58.py fournit une assez bonne implémentation d'un codec base58 qui fonctionne à la fois avec Python 2.5+ et Python 3.0. Il y a pas mal de documentation qui explique pourquoi base58 est approprié. J'espère que cela vous aidera.
0 votes
J'ai fait de ma version js un projet open source, regardez-le : github.com/sbussard/encode-the-things
0 votes
Duplicata possible de Existe-t-il une bonne bibliothèque python capable de transformer les nombres en leurs "symboles" respectifs ?
0 votes
Cela pourrait aider : github.com/suminb/base62
0 votes
Soyez prudent avec votre définition de Base62. L'internet propose un grand nombre de définitions et il n'y a pas de norme apparente. Wikipedia indique A-Za-z0-9. De nombreuses réponses ici indiquent 0-9a-zA-Z et j'ai vu 0-9A-Za-z. Si vous transmettez les données à des personnes, assurez-vous de leur donner votre définition.