Je travaille actuellement sur la création d'un raccourci d'URL pour mon site et mon plan actuel (je suis ouvert aux suggestions) consiste à utiliser un ID de nœud pour générer l'URL raccourcie. Donc, en théorie, le noeud 26 pourrait être short.com/z
, le noeud 1 pourrait être short.com/a
, le noeud 52 pourrait être short.com/Z
et le noeud 104 pourrait être short.com/ZZ
. Lorsqu'un utilisateur accède à cette URL, je dois inverser le processus (évidemment).
Je peux penser à des moyens peu scrupuleux de s'y prendre, mais j'imagine qu'il en existe de meilleurs. Aucune suggestion?
ASCII à int:
ord('a')
donne 97
Et revenons à une chaîne:
str(unichr(97))
str(chr(97))
donne 'a'
>>> ord("a")
97
>>> chr(97)
'a'
Si plusieurs caractères sont liés dans un seul entier/long, comme ce fut mon problème:
s = '0123456789'
nchars = len(s)
# string to int or long. Type depends on nchars
x = sum(ord(s[byte])<<8*(nchars-byte-1) for byte in range(nchars))
# int or long to string
''.join(chr((x>>8*(nchars-byte-1))&0xFF) for byte in range(nchars))
Rend '0123456789'
et x = 227581098929683594426425L
Qu'en est-il de BASE58 codant l'URL? Comme par exemple flickr.
# note the missing lowercase L and the zero etc.
BASE58 = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
url = ''
while node_id >= 58:
div, mod = divmod(node_id, 58)
url = BASE58[mod] + url
node_id = int(div)
return 'http://short.com/%s' % BASE58[node_id] + url
Remettre cela dans un nombre n'est pas une grosse affaire non plus.