C 使用OpenSSL'拆分一个数字;s BIGNUM尽可能快
我使用OpenSSL的BIGNUM库来处理任意精度的数字 我需要把一个数字分成两部分。我需要一个数字中的前n位[0,n-1](我指的是n个最低有效位),其余的位[n,end]在另一个数字中 我的代码是这样的C 使用OpenSSL'拆分一个数字;s BIGNUM尽可能快,c,openssl,bignum,C,Openssl,Bignum,我使用OpenSSL的BIGNUM库来处理任意精度的数字 我需要把一个数字分成两部分。我需要一个数字中的前n位[0,n-1](我指的是n个最低有效位),其余的位[n,end]在另一个数字中 我的代码是这样的 void number_split(BIGNUM * first_n_bits, BIGNUM * the_rest, BIGNUM * number, long n) { int i = 0; BN_copy(first_n_bits, number); int
void number_split(BIGNUM * first_n_bits, BIGNUM * the_rest, BIGNUM * number, long n) {
int i = 0;
BN_copy(first_n_bits, number);
int bits = BN_num_bits(first_n_bits);
while(bits > n) {
BN_clear_bit(first_n_bits, --bits);
}
if(BN_num_bits(number) > n) {
BN_rshift(the_rest, number, n);
} else {
BN_copy(the_rest, zero);
}
}
我已经确定这个函数是我的应用程序执行时间的最大贡献者之一,所以让它稍微快一点会对我有很大帮助
似乎可以改进的部分是while
循环,在该循环中,我一次清除一个最重要的位。我本以为BIGNIM可以更有效地实现这一点,但我找不到它
那么,我能做些什么来加快这一速度呢?您可以使用
BN\u mask\u bits()
函数,它应该比循环每一位更快
// BN_num_bits(num) must be >= n
void number_split(BIGNUM *low_bits, BIGNUM *high_bits, BIGNUM *num, long n) {
BN_copy(low_bits, num);
BN_mask_bits(low_bits, n);
BN_rshift(high_bits, num, n);
}
如果有可能BN_num_bits(num)
则添加检查:
void number_split(BIGNUM *low_bits, BIGNUM *high_bits, BIGNUM *num, long n) {
BN_copy(low_bits, num);
if(BN_num_bits(num) <= n) {
BN_copy(high_bits, zero);
} else {
BN_mask_bits(low_bits, n);
BN_rshift(high_bits, num, n);
}
}
void number\u分割(BIGNUM*低位、BIGNUM*高位、BIGNUM*num、long n){
BN_拷贝(低位,num);
if(BN_num_位(num)您的解决方案有一个小小的变化,BN\u mask\u bits
对num进行了就地修改,它不会将结果放入一个新的结构中,如BN\u rshift
那样。因此,您必须先将num
复制到低位,然后再将低位
屏蔽,谢谢!这很好!我的应用程序的净速度提高了33%从这里开始。@Luke,哦,是的-我更新了我的答案,在BN\u-copy()
之前使用BN\u-mask\u-bits()
。很高兴听到它有帮助!