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(),把所有的計算結果返回