使用boost進行CRC64計算
阿新 • • 發佈:2018-12-16
因接入平臺,平臺提供的是一個字串的key作為使用者標識,而且要用到分散式,所以沒法用以前的資料庫遞增來做使用者ID,於是用CRC64來生成uint64_t來作為使用者ID,做法也比較簡單。如下:
std::map<size_t, size_t> xLongMap; char szTemp[128] = {0}; boost::crc_optimal<64, 0x04C11DB7, 0, 0, false, false> crc; for (uint32_t i = 0; i < 1000000000; ++i) { memset(szTemp, 0, sizeof(szTemp)); sprintf_s(szTemp, "%d%s%s%s", i, "1a2b3c", "4d5e6f", "7g8h9i"); crc.process_bytes(szTemp, strlen(szTemp)); size_t nPos = crc.checksum(); crc.reset(); if (!xLongMap.insert(std::map<size_t, size_t>::value_type(nPos, 0)).second) { std::cout << "重複了,當前數量:" << i << ", 字串為:" << szTemp << ", hash pos: " << nPos << std::endl; system("pause"); break; } }
需要包含boost/crc.hpp
測試下來1.3億沒有重複,還是比較給力的。
可惜的是後來也沒用到這個演算法,因為key中有URL轉義,導致有%這樣的字元,後來就用了別的方法。