将 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'
我尝试了几种不同的方法,来自
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'