【发布时间】:2014-08-01 21:37:29
【问题描述】:
给定一个固定大小的 C++ 字节数组(模板函数)和一个无符号整数,我如何计算余数(通常是整数的 % 运算符)。
这是我目前使用 GMP 的方法:
template <typename HashType>
uint64_t remainder(const HashType& value, const uint64_t divisor)
{
mpz_t integ;
mpz_init(integ);
mpz_import(integ, value.size(), 1, 1, 1, 0, value.data());
uint64_t remainder = mpz_fdiv_ui(integ, divisor);
mpz_clear(integ);
return remainder;
}
最好去掉 GMP 依赖,并通过不需要设置和拆卸代码来提高性能(直接使用字节数组)。
顺便说一句,是否有任何算法可以更快地找到余数,但仅适用于除数的某个子集(例如素数)? (仅供参考,这用于哈希桶,所以如果我可以选择除数的值)
【问题讨论】:
-
显然,找到 2 的幂的余数是微不足道的,但对于您的应用程序可能不切实际。 (您要么不得不使用少量的存储桶,要么拥有相当大的哈希表,并且两者都会影响性能)。此外,您是否有理由将散列到字节数组中,然后您将使用适合
uint64_t的东西来调制结果?您可能只想使用无符号整数包装算法。 -
找到一个 BigInteger 类,将字节数组放入其中并使用为该类定义的
operator%。例如,您可以在github.com/barakman/Num 上查看class NaturalNum。
标签: c++ algorithm optimization hashtable division