这是我想在 Python 中实现的 Ruby 部分:
Base64.urlsafe_encode64([Digest::MD5.hexdigest(url).to_i(16)].pack("N")).sub(/==\n?$/, '')
你看,这有助于将 URL 变成这样:
http://stackoverflow.com/questions/ask
变成这样的小代码:
sUEBtw
在这个过程中生成的大整数是这样的:
307275247029202263937236026733300351415
我已经能够使用以下 Python 代码将其打包成二进制形式:
url = 'http://stackoverflow.com/questions/ask'
n = int(hashlib.md5(url).hexdigest(), 16)
s = struct.Struct('d')
values = [n]
packed_data = s.pack(*values)
short_code = base64.urlsafe_b64encode(packed_data)[:-1]
print short_code
我得到的短代码是这样的:
zgMM62Hl7Ec
正如你所看到的,它比我用 Ruby 得到的要大,这个包装使用了不同的格式。
你的帮助将不胜感激。