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

Fastest way to convert gmpy2 mpz to a bigendian byte-array (bytes)?

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

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,那也可能有帮助!

我认为 gmpy2.to_binary() 会满足您的需求。它将 gmpy2 object 转换为可移植字节序列。它使用 mpz_export 将基础 mpz_t 转换为字节序列。包含 gmpy2 类型和长度的短 header 放在字节序列的开头。对于 gmpy2.mpz 类型(假设值不为 0),header 是两个字节长。

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