在python中为url参数生成固定长度哈希

LeR*_*Roy 11 python url hash google-app-engine

我正在使用appengine的python工作.

我正在尝试创建相当于youtube网址(http://www.youtube.com/watch?v= XhMN0wlITLk)中"v"值的内容,以便检索特定实体.数据存储区自动生成密钥,但它太长(34位).我已经尝试使用hashlib构建我自己的,但我又得到一个长字符串.我想将它保持在11位以下(我没有处理大量的实体),字母和数字是可以接受的.

似乎应该有一个非常标准的解决方案.我可能只是错过了它.

z33*_*33m 8

您可以使用密钥的自动生成的整数id来生成哈希.生成散列的一种简单方法是将整数id转换为base62(字母数字).要获取对象,只需从base62转换为十进制,然后使用get_by_id检索对象.

这是我在我的一个应用程序中使用的简单base62转换函数.

import string
alphabet = string.letters + string.digits
max = 11

def int_to_base62(num):
    if num == 0:
        return alphabet[0]

    arr = []
    radix = len(alphabet)
    while num:
        arr.append(alphabet[num%radix])
        num /= radix
    arr.reverse()
    return (alphabet[0] * (max - len(arr))) + ''.join(arr)

def base62_to_int(str):
    radix = len(alphabet)
    power = len(str) - 1
    num = 0
    for char in str:
        num += alphabet.index(char) * (radix ** power)
        power -= 1
    return num
Run Code Online (Sandbox Code Playgroud)


Ned*_*der 6

如果您拥有每个实体唯一的值,则可以通过对其进行散列和截断来获得更短的版本.像md5或sha1这样的散列是混合良好的,这意味着如果改变输入中的一位,输出中的每一位都有50%的翻转几率.如果你截断哈希,你只是增加了碰撞的几率,但你可以在长度和碰撞几率之间进行权衡.

Url-safe base64编码是将哈希转换为文本的好选择.

orig_id = 'weiowoeiwoeciw0eijw0eij029j20d232weifw0jiw0e20d2' # the original id
shorter_id = base64.urlsafe_b64encode(hashlib.md5(orig_id).digest())[:11]
Run Code Online (Sandbox Code Playgroud)

使用base64,每个字符有6位信息,11个字符给你66位唯一性,或者1到2**66的碰撞几率.