#include<bits/stdc++.h> using namespace std; unsigned int getBlkno(string &input_data,int idx){ string s = input_data.substr(idx*4,4); unsigned int res = 0; for(int i=0;i<4;i++){ res += s[i]<<(24-i*8); } return res; } unsigned int Murmurhash3(string input_data,unsigned int seed){ unsigned int h = seed; //声明常量 const unsigned int c1 = 0xcc9e2d51; // 3,432,918,353 const unsigned int c2 = 0x1b873593; // 461,845,907 const int r1 = 15; const int r2 = 13; const int m = 5; const int n = 0xe6546b64; //3,864,292,196 //分块处理 int blkNums = input_data.size()/4; //1.一个块一个块地处理,这是第一部分地工作 for(int i=0;i<blkNums;i++){ unsigned int K = getBlkno(input_data,i); K *= c1; K = _rotl(K,r1); K *= c2; K = _rotl(K,r2); h = h*m + n; } //2.处理剩余量 string remaining_bytes = input_data.substr(blkNums*4); unsigned int k = 0; switch (remaining_bytes.size()){ case 3:k^=remaining_bytes[2]<<16; case 2:k^=remaining_bytes[1]<<8; case 1:k^=remaining_bytes[0]; } k = k * c1; k = _rotl(k,r1); k = k * c2; h ^= k; h ^= input_data.size(); //3.加强雪崩测试 h ^= h >> 16; h *= 0x85ebca6b; // 2,246,822,507 h ^= h >> 13; h *= 0xc2b2ae35; // 3,266,489,909 h ^= h >> 16; return h; } int main(){ string input_data = "Jack"; int seed = 123; cout<<"Murmurhash3(Jack,123) = "<<Murmurhash3(input_data,seed); system("pause"); }
时间: 2024-04-24 17:22:02 浏览: 99
这是一个实现 Murmurhash3 哈希算法的 C++ 代码。Murmurhash3 是一种高速非加密型哈希算法,可以快速地计算输入数据的哈希值。该算法的主要特点是具有高度的随机性和均匀性,适用于各种哈希表、哈希索引等场景。
代码中的 getBlkno 函数用于将字符串按块转换为 unsigned int 类型的数字,Murmurhash3 函数则是实现了 Murmurhash3 算法的主要函数。该函数首先定义了一些常量和变量,然后将输入数据分块处理,对每个块进行一系列的位运算和乘法,最终将所有块的结果累加得到哈希值。如果输入数据长度不是块大小的整数倍,则会对剩余的字节进行额外处理。最后,通过加强雪崩测试来进一步增强哈希值的随机性和均匀性。
在 main 函数中,给定了输入数据和种子值,通过调用 Murmurhash3 函数计算出了对应的哈希值,并输出到控制台。
相关问题
#include <bits/stdc++.h> using namespace std
这段代码是一个C++的头文件引用和命名空间的使用示例。具体来说,`#include <bits/stdc++.h>`是一个常用的头文件引用方式,它包含了C++标准库中的所有头文件。而`using namespace std`则是为了使用`std`命名空间中的标准库函数和对象,这样就可以直接使用`cout`、`cin`等标准输入输出流对象,而不需要写`std::cout`、`std::cin`。
这种写法虽然方便,但也存在一些问题。首先,包含了所有的标准库头文件可能会导致编译时间变长。其次,使用了`using namespace std`会将整个`std`命名空间中的所有标识符引入当前作用域,可能会导致命名冲突。因此,在实际开发中,建议根据需要只包含需要的头文件,并使用具体的命名空间来避免潜在的问题。
解释以下学生教务管理系统代码:#include <easyx_graphics.h> #include <bits/stdc++.h> using namespace std; class comFinal { string name; int Chinese; int English; int Math; public: comFinal(string name, int Chinese, int English, int Math) { this->Chinese = Chinese;
这段代码定义了一个名为comFinal的类,表示学生成绩的最终结果。该类包含了4个数据成员:name表示学生姓名,Chinese表示语文成绩,English表示英语成绩,Math表示数学成绩。同时,该类还定义了一个构造函数,用于初始化数据成员。构造函数的参数包括学生姓名、语文成绩、英语成绩、数学成绩,这些参数会被用于初始化对应的数据成员。
此外,这段代码还引用了两个头文件:easyx_graphics.h和bits/stdc++.h。easyx_graphics.h是EasyX图形库的头文件,用于绘制图形界面;bits/stdc++.h是C++标准库的头文件,包含了所有标准库的头文件。
阅读全文