TEST(ch3, timing) { unsigned i; struct timeval lstart, lend; uint64_t start, end; std::vector<char> keys((MAX_KEY_LENGTH + 1) * NUM_LOOKUPS); char* keys_itr; printf("Servers:\t\t%d\n", NUM_SERVERS); printf("Lookups:\t\t%d\n", NUM_LOOKUPS); printf("Generating lookup keys..."); fflush(stdout); srand(time(nullptr)); for (i = 0, keys_itr = keys.data(); i < NUM_LOOKUPS; ++i, keys_itr += MAX_KEY_LENGTH + 1) { make_random_key(keys_itr, MAX_KEY_LENGTH); } printf(" done\n"); printf("Starting INconsistent hashing timing tests..."); fflush(stdout); gettimeofday(&lstart, nullptr); for (i = 0, keys_itr = keys.data(); i < NUM_LOOKUPS; ++i, keys_itr += MAX_KEY_LENGTH + 1) { uint32_t hash_code = crc32_hash(keys_itr, strlen(keys_itr)); uint32_t server_num = inconsistent_hashing_lookup(hash_code, NUM_SERVERS); (void)server_num; /* to avoid compiler warning */ } gettimeofday(&lend, nullptr); printf(" done\n"); start = ((uint64_t)lstart.tv_sec) * 1000000 + lstart.tv_usec; end = ((uint64_t)lend.tv_sec) * 1000000 + lend.tv_usec; printf( "Lookup:\t\t\t%zdus total\t%0.3fus/query\n", (end - start), ((float)(end - start)) / NUM_LOOKUPS); printf("Starting consistent hashing timing tests..."); fflush(stdout); gettimeofday(&lstart, nullptr); for (i = 0, keys_itr = keys.data(); i < NUM_LOOKUPS; ++i, keys_itr += MAX_KEY_LENGTH + 1) { auto res = furc_hash(keys_itr, strlen(keys_itr), NUM_SERVERS); EXPECT_LT(res, NUM_SERVERS); } gettimeofday(&lend, nullptr); printf(" done\n"); start = ((uint64_t)lstart.tv_sec) * 1000000 + lstart.tv_usec; end = ((uint64_t)lend.tv_sec) * 1000000 + lend.tv_usec; printf( "Lookup:\t\t\t%zdus total\t%0.3fus/query\n", (end - start), ((float)(end - start)) / NUM_LOOKUPS); }
unsigned int digested_rule(unsigned int* m, gzFile f) { int i; uint32_t digest = 0; uint32_t key; for(i=0;i<6;i++) { key = m[i]; digest += crc32_hash(key); } gzprintf(f, "%08x\n", digest); return 0; }
int TCPSockClient::do_register(void) { int push_id = PUSH_BEGIN + m_index; std::stringstream sstream; sstream << push_id; std::string server_id; sstream >> server_id; unsigned source = crc32_hash((const unsigned char*) server_id.c_str(), server_id.length()); VncDataPackage package; package.setSourceAndTarget(source, SERVER_ID); package.setCommandId(0x00010004, 0); package.setStringParam(server_id); std::string returnbuf = package.getProtocolBuffer(); writeMsg(this->m_sockfd, (char *) returnbuf.c_str(), returnbuf.length()); return 0; }
inline Crc32 crc32_hash(const std::string &str){ return crc32_hash(str.data(), str.size()); }
inline Crc32 crc32_hash(const char *str){ return crc32_hash(str, std::strlen(str)); }