1

我正在寻找字符串和整数输入的哈希值。使用 murmurhash3,我可以为字符串而不是整数:

pip install murmurhash3
import mmh3
mmh3.hash(34)

返回以下错误:

TypeError: a bytes-like object is required, not 'int'

我可以将它转换为这样的字节:

mmh3.hash(bytes(34))

但是如果输入是字符串,我会收到一条错误消息

如何在将整数转换为字符串的情况下克服这个问题?

4

1 回答 1

1

如何在将整数转换为字符串的情况下克服这个问题?

你不能。或者更准确地说,您需要将其转换为bytesstr某种方式,但它不必是像b'34'/这样的人类可读的文本形式'34'。Python 3 的一种常见方法是:

my_int = 34  # Or some other value
my_int_as_bytes = my_int.to_bytes((my_int.bit_length() + 7) // 8, 'little')

这使得原始字节的极简表示int(无论长度如何);for 34,你会得到b'"'(因为它只需要一个字节来存储它,所以你基本上得到了一个bytes带有序数值的对象),但是对于更大int的 s 它仍然有效(不像胡乱使用chr),而且它总是一样小尽可能(每字节获取 8 位数据,而不是像转换为文本字符串那样每字节超过 3 位)。

如果您使用的是 Python 2(为什么?!?它已经停产将近一年),int.to_bytes不存在,但您可以通过各种方式以中等效率伪造它,例如(仅处理非负值,与to_bytes使用简单标志处理有符号值不同):

 from binascii import unhexlify

 my_int_as_bytes = unhexlify('%x' % (my_int,))
于 2020-11-30T15:28:17.853 回答