Python如何缩短uuuid并进行解码?

Pro*_*eus 1 python django python-2.7

我正在尝试使用以下方法为我的一个模型创建一个缩短的ID:

_char_map = string.ascii_letters+string.digits

def index_to_char(sequence):
    return "".join([_char_map[x] for x in sequence])

    def make_short_id(self):
        _id = self.id
        digits = []
        while _id > 0:
            rem = _id % 62
            digits.append(rem)
            _id /= 62
        digits.reverse()
        return index_to_char(digits) 

    @staticmethod
    def decode_id(string):
        i = 0
        for c in string:
            i = i * 64 + _char_map.index(c)
        return i
Run Code Online (Sandbox Code Playgroud)

self.iduuid即在哪里1c7a2bc6-ca2d-47ab-9808-1820241cf4d4,但出现以下错误:

rem = _id%62 TypeError:在字符串格式化期间并非所有参数都已转换

仅当id是时,此方法才有效int

如何修改缩短uuuid和解码的方法?

更新:

感谢您的帮助。我试图找到一种创建编码和解码方法的方法,该方法采用一个字符串,使其变短,然后再次将其解码。上面指出的方法永远无法使用字符串(uuid),

And*_*zlo 5

%运算符是字符串格式化或插值运算符,与字符串一起使用时,不会在Python中返回余数。它将尝试返回格式化的字符串。

我不确定您输入的内容是什么,但是请尝试使用进行转换,以int获取其余信息。

编辑:我现在看到您的输入,不确定为什么我错过了。这是将UUID转换为数字的一种方法:

import uuid
input = "1c7a2bc6-ca2d-47ab-9808-1820241cf4d4"
id = uuid.UUID(input)
id.int
# returns 37852731992078740357317306657835644116L
Run Code Online (Sandbox Code Playgroud)

不确定“缩短”是什么意思,但您似乎正在尝试对UUID进行“ base 62编码”。如果您使用此问题中的函数,将得到以下结果:

uuid62 = base62_encode(id.int)
# uuid62 contains 'RJChvUCPWDvJ7BdQKOw7i'
Run Code Online (Sandbox Code Playgroud)

取回原始UUID:

# Create a UUID again
id = uuid.UUID(int=base62_decode(uuid62))

id.hex
# returns '1c7a2bc6ca2d47ab98081820241cf4d4'           

str(id)
# returns '1c7a2bc6-ca2d-47ab-9808-1820241cf4d4'
Run Code Online (Sandbox Code Playgroud)