【发布时间】:2021-04-23 17:56:49
【问题描述】:
我正在使用一个 openssl EVP_PKEY_sign,其中签名缓冲区大小是已知的,可以使用向量进行分配。
size_t SignatureLength;
std::vector<unsigned char> Signature;
EVP_PKEY_sign(EvpPkeyCtx, NULL, &SignatureLength, MessageDigest.data(), MessageDigest.size());
Signature.resize(SignatureLength);
EVP_PKEY_sign(EvpPkeyCtx, Signature.data(), &SignatureLength, MessageDigest.data(), MessageDigest.size());
Signature.resize(SignatureLength);
我正在使用Signature.data() 来获取指向向量使用的缓冲区的原始指针。
第一次调用EVP_PKEY_sign 给出了输出签名缓冲区的最大长度。
在调用 resize 时,缓冲区会被 0 填满,这会导致额外的开销,使其成为 O(n) 操作,而只需要 O(1) 分配。
另一种方法是调用reserve,但它失败了,因为它只分配内存并再次调用EVP_PKEY_signMessageDigest.size()仍然为零并将其调整为实际签名长度(来自第二次调用)然后将覆盖缓冲区默认值。
这样做的有效方法是什么?
【问题讨论】:
-
这里的根本问题是两种不同语言之间的互操作,C 和 C++。它相对容易——例如,C++ 和 Python 更难,或者 C 和 Java。但即便如此,由于 C 和 C++ 有不同的方式来管理内存,因此效率会有所下降。
标签: c++ vector stl openssl c++17