将gmpy2 mpz转换为bigendian字节数组(字节)的最快方法是什么?

时间:2017-03-04 23:21:51

标签: python-3.x gmpy

我尝试了几种不同的方法,来自

def ToByteArray(x):
    x = int(x)
    return x.to_bytes((x.bit_length() + 7) // 8, byteorder='big')

或将x跳过256并在循环中构建一个新的bytearray,但与普通python int或gmpy2 c ++的转换相比,它感觉很慢。

在c ++中是不是有类似mpz_export的东西?实现这一目标的最快方法是什么?

修改:我需要将其转换为bytes的原因是hashlib无法哈希mpz。如果还有另一种快速方法可以获得mpz的强加密(sha256)哈希值,而不必先将其转换为bytes,那么这也有帮助!

1 个答案:

答案 0 :(得分:1)

我认为gmpy2.to_binary()会做你需要的。它将gmpy2对象转换为可移植字节序列。它使用mpz_export将基础mpz_t转换为字节序列。包含gmpy2类型和长度的短标头位于字节序列的开头。对于gmpy2.mpz类型(假设值不为0),标头长度为两个字节。

>>> gmpy2.to_binary(gmpy2.mpz(123456**7))
b'\x01\x01\x00\x00\x00\x00\x00\xe4\x9f\xcc\xfb\xad\xe5\x1f\xec.T'