我有无符号的64位整数,我想用作App Engine数据存储区密钥。不幸的是,NDB数据存储区API似乎仅允许最大为的带符号的64位整数pow(2, 63)
。
我可以两个互补的整数,但我依靠在数据存储进行查询的排序顺序,所以我想0xffffffffffffffff
以后到来0x0
之前不是升序排列。我相信,如果我对我的64位无符号整数进行二进制补码(0xffffffffffffffff
例如-1
由数据存储区索引0x0
解释并0
例如被解释),就会发生这种情况。
我可以将每个无符号的64位密钥从整数更改为字符串,甚至是十六进制字符串,但是与将密钥保留为64位整数相比,这将在数据存储区中占用更多的空间。
多亏了Tim Hoffman和Guido van Rossum的回答,您才能将64位无符号整数用作App Engine数据存储区中的实体键,并不能保留排序顺序。
如果您不关心排序顺序,则可以对无符号的64位整数进行二进制补码,然后使用它。
最后,我将无符号的64位整数更改为固定宽度的十六进制字符串,并将其保存为密钥,因为这似乎最方便,但会占用一些空间。
我使用的功能如下所示:
def to_hex_string(unsigned_64bit_int):
return '{:016x}'.format(my_unsigned_64bit_int)
def to_unsigned_64bit_int(hex_string):
return int(hex_string, 16)
如果空间很关键,Guido van Rossum建议使用保留排序顺序的base-64编码。我不确定Python base64模块编码器是否保留排序顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句