我正在为我的网站制作一个URL缩短器,我目前的计划(我愿意接受建议)是使用节点ID来生成缩短的URL。因此,理论上,节点26可以是short.com/z
,节点1可以是short.com/a
,节点52可以是short.com/Z
,节点104可以是short.com/ZZ
。当用户访问该URL时,我需要反转该过程(显然)。
我可以想到一些方法可以解决这个问题,但我猜测有更好的方法。有什么建议吗?
答案 0 :(得分:202)
ASCII到int:
ord('a')
给出97
回到字符串:
str(unichr(97))
str(chr(97))
给出'a'
答案 1 :(得分:80)
>>> ord("a")
97
>>> chr(97)
'a'
答案 2 :(得分:7)
如果多个字符绑定在一个整数/长整数内,那就像我的问题一样:
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))
收益'0123456789'
和x = 227581098929683594426425L
答案 3 :(得分:6)
BASE58编码URL怎么样?比如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
将其转回一个数字也不是什么大问题。
答案 4 :(得分:-1)
使用hex(id)[2:]
和int(urlpart, 16)
。还有其他选择。 base32编码你的id也可以工作,但我不知道有任何库在Python中内置了base32编码。
显然在Python 2.4中使用base64 module引入了base32编码器。您可以尝试使用b32encode
和b32decode
。如果人们写下缩短的网址,您应该True
casefold
选项map01
b32decode
{/ 1}}。
实际上,我接受了。我仍然认为base32编码是一个好主意,但该模块对URL缩短的情况没有用。您可以查看模块中的实现,并针对此特定情况自行创建。 : - )