我正在用 c++ 编写一些代码,用于需要使用多精度库(如 boost)的类分配。基本上,我需要用一些大整数构建一个哈希表,然后在该表中查找某个值。
当我使用注释掉的 h、g、p 时 - 代码运行良好且非常快。一旦我切换到未注释掉的那些,它会在以下行引发内存异常: hash_str>::iterator got = mp.find(lkp); 我刚开始使用 c++ 并且很确定有些事情还很遥远,因为即使数量很大,它也应该运行得相当快。
#include <boost/unordered_map.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/math/special_functions/pow.hpp>
using namespace std;
using namespace boost::multiprecision;
template <typename T>
struct hash_str
{
size_t operator()( const T& t ) const
{
return std::hash<std::string>()
( t.str() );
}
};
int main()
{
boost::unordered_map<cpp_int, cpp_int, hash_str<cpp_int>> mp;
//boost::unordered_map<hash_str<cpp_int>, cpp_int, hash_str<cpp_int>> mp;
cpp_int k;
cpp_int h( "3239475104050450443565264378728065788649097520952449527834792452971981976143292558073856937958553180532878928001494706097394108577585732452307673444020333" );
cpp_int g( "11717829880366207009516117596335367088558084999998952205599979459063929499736583746670572176471460312928594829675428279466566527115212748467589894601965568" );
//cpp_int g = 1010343267;
//cpp_int h = 857348958;
//cpp_int p = 1073676287;
cpp_int p( "13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084171" );
int b = pow( 2, 20 );
cpp_int denom;
cpp_int inv = powm( g, p - 2, p );
//building a hash table of all values h/g^x1
for ( cpp_int x = 1; x < b; ++x )
{
// go through all 2^20 values up to b, calculate the function h/g^x1,
// then hash it to put into table
denom = powm( inv, x, p );
k = ( h *denom ) % p;
mp.insert( std::make_pair( k, x ) );
}
cpp_int lkp;
for ( int v = 1; v < b; ++v )
{
//cpp_int gb = pow(g, b);
lkp = powm( g, v*b, p );
//looking for a match for g^b^x0 in map mp; when found we need to find x
//which is x1 and then calc 'x'
boost::unordered::unordered_map<cpp_int, cpp_int, hash_str<cpp_int>>::iterator got = mp.find( lkp );
// Check if iterator points to end of map or if we found our value
if ( got != mp.end() )
{
std::cout << "Element Found - ";
//std::cout << got->first << "::" << got->second << std::endl;
}
/*else
{
std::cout << "Element Not Found" << std::endl;
}*/
}
return 0;
}
以防万一,这是我得到的异常:MiM.exe 中 0x768F2F71 处的未处理异常:Microsoft C++ 异常:boost::exception_detail::clone_impl > 在内存位置 0x0109EF5C。