crc_optimal—-boost学习笔记
知识标签 : boost, crc, C++
boost/crc.hpp中可查到
//Bits常选32或64,表示生成CRC32或CRC64校验码
template < std::size_t Bits, BOOST_CRC_PARM_TYPE TruncPoly,
BOOST_CRC_PARM_TYPE InitRem, BOOST_CRC_PARM_TYPE FinalXor,
bool ReflectIn, bool ReflectRem >
class crc_optimal
常用接口
public:
// 构造函数
explicit crc_optimal( value_type init_rem = InitRem );
void reset( value_type new_rem = InitRem );
// 计算单字符的CRC
void process_byte( unsigned char byte );
// 该函数计算内存块CRC,由头文件中实现代码可知:
// 它循环调用process_byte(unsigned char byte)
void process_block( void const *bytes_begin, void const *bytes_end );
// 该函数计算内存块CRC,调用process_block
void process_bytes( void const *buffer, std::size_t byte_count );
// 返回CRC结果
value_type checksum() const;
// 以下两个重载operator()含义完全不一样,勿混淆
// 重载operator(),它调用process_byte()
void operator ()( unsigned char byte );
// 重载operator(),调用checksum()
value_type operator ()() const;
private:
// Member data
value_type rem_;
又有
typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true>
crc_32_type;
下面用crc_32_type写段测试小程序
#include<iostream>
#include<algorithm>
#include<boost/crc.hpp>
int main(void)
{
boost::crc_32_type crc32; //一个crc对象
std::cout << std::hex; //设置16进制输出
std::cout << crc32.checksum() << std::endl;
crc32.process_byte('a'); //计算一个byte
std::cout << crc32.checksum() << std::endl; //结果
crc32.process_bytes("0123456789", 10); //计算10个字节
std::cout << crc32.checksum() << std::endl;
char szCh[] = "0123456789";
crc32.reset(); //重新初始化
crc32.process_block(szCh, szCh + 10); //使用内存块计算
std::cout << crc32.checksum() << std::endl;
std::cout << "--------------------" << std::endl;
crc32.reset();
crc32.process_bytes("0123456789", 10);
std::cout << crc32() << std::endl;
std::string str("0123456789");
crc32.reset();
//对于for_each见下面解释
std::cout << std::for_each(str.begin(), str.end(), crc32)() << std::endl;
std::cout << crc32() << std::endl; //无参,相当于checksum()
return 0;
}
结果如下
总结
由结果可知,同一数据CRC序列结果相同
猜想:crc_optimal参数设置合理的话,64bitCRC序列应该可以用做hash函数返回值
对于for_each有
template<class _InIt, class _Fn1>
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{// perform function for each element
for (; _First != _Last; ++_First)
_Func(*_First);
return (_Func); // 返回函数对象_Func
}
- for_each(str.begin(), str.end(),crc32)依次把str中的元素作为crc32()的一个参数
- 它相当于对str每一个元素执行process_byte()
- 之后for_each返回crc32函数对象
for_each后面又多了一对(),表示调用crc32(),即相当于checksum(),把所有的计算结果返回