Python 2和3在散列uuid

时间:2017-01-01 03:42:15

标签: python-2.7 python-3.x uuid

我有一些在python 2中运行的py2代码:

    import uuid
    import hashlib

    playername = "OfflinePlayer:%s" % name  # name is just a text only username
    m = hashlib.md5()
    m.update(playername)
    d = bytearray(m.digest())
    d[6] &= 0x0f
    d[6] |= 0x30
    d[8] &= 0x3f
    d[8] |= 0x80
    print(uuid.UUID(bytes=str(d)))

然而,当代码在python3中运行时,它产生" TypeError:必须在散列之前对Unicode对象进行编码"当m.update()尝试时。我尝试使用默认的utf-8首先对其进行结束编码:

m.update(playername.encode())

但现在这一行 -

print(uuid.UUID(bytes=str(d)))

产生此错误:

  File "/usr/lib/python3.5/uuid.py", line 149, in __init__
    raise ValueError('bytes is not a 16-char string')
ValueError: bytes is not a 16-char string

然后我尝试将其解码回来,但按位操作显然毁了它(我在猜猜?):

    print(uuid.UUID(bytes=(d.decode())))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 2: invalid start byte

我真的不知道按位操作的目的是什么?"大图片"。一般来说,代码片段应该根据用户名的拼写每次生成相同的预期UUID。

我只是想让这段代码在Python3中完成与Python 2相同的工作:(

提前致谢。

1 个答案:

答案 0 :(得分:1)

有几件事:

m.update(playername.encode('utf-8'))

应该正确编码你的字符串。

print(uuid.UUID(bytes=bytes(d)))

应该正确返回UUID。

示例:

https://repl.it/EyuG/0