我正在尝试使用以下方法为我的一个模型创建一个缩短的 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
self.id
是一个 uuid,即 1c7a2bc6-ca2d-47ab-9808-1820241cf4d4
,但我收到以下错误:
rem = _id % 62 TypeError: not all arguments converted during string formatting
此方法似乎仅在 id
为 int
时有效。
如何修改缩短uuuid并解码的方法?
更新:
谢谢你的帮助。我试图找到一种方法来创建一个编码和解码方法,该方法采用一个字符串,使其更短然后再次解码。正如所指出的,上述方法永远不能使用字符串 (uuid),
最佳答案
%
运算符是字符串格式化或插值运算符,在与字符串一起使用时不返回 Python 中的余数。它将尝试返回一个格式化的字符串。
我不确定你的输入是什么,但尝试使用 int
转换它,这样你就可以获得它的其余部分。
编辑:我现在看到了你的输入,不知道为什么我错过了它。这是将 UUID 转换为数字的一种方法:
import uuid
input = "1c7a2bc6-ca2d-47ab-9808-1820241cf4d4"
id = uuid.UUID(input)
id.int
# returns 37852731992078740357317306657835644116L
不确定“缩短”是什么意思,但看起来您正在尝试对 UUID 进行“base 62 编码”。如果您使用 this question 中的函数你最终会得到以下结果:
uuid62 = base62_encode(id.int)
# uuid62 contains 'RJChvUCPWDvJ7BdQKOw7i'
要取回原始 UUID:
# Create a UUID again
id = uuid.UUID(int=base62_decode(uuid62))
id.hex
# returns '1c7a2bc6ca2d47ab98081820241cf4d4'
str(id)
# returns '1c7a2bc6-ca2d-47ab-9808-1820241cf4d4'
关于Python如何缩短uuuid并解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28169164/