私は自分のサイトのURL短縮サービスの作成に取り組んでおり、現在の計画(提案に応じています)は、ノードIDを使用して短縮URLを生成することです。そのため、理論上、ノード26はshort.com/z
、ノード1はshort.com/a
、ノード52はshort.com/Z
、ノード104はshort.com/ZZ
になります。ユーザーがそのURLにアクセスしたら、プロセスを逆にする必要があるのは明らかです。
これについてはいくつかの気の利いた方法を考えることができますが、もっと良い方法があると思います。助言がありますか?
ASCIIからint:
ord('a')
97
を与える
そして、文字列に戻ります。
str(unichr(97))
str(chr(97))
'a'
を与える
>>> ord("a")
97
>>> chr(97)
'a'
私の問題のように、複数の文字が単一の整数/ロング内にバインドされている場合:
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
を生成します
URLをエンコードするBASE58はどうですか?たとえば、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
それを数値に戻すことも大したことではありません。