这里我有用于计算unsigned char的哈希值的代码
#include <cstdlib>
#include <iostream>
#include<string.h>
using namespace std;
unsigned oat_hash(unsigned char *key,int len)
{
unsigned char *p=key;
unsigned h=0;
int i;
for(i=0;i<len;++i){
h+=p[i];
h+=(h<<10);
h^=(h>>6);
}
h+=(h<<3);
h^=(h>>11);
h+=(h<<15);
return h;
}
using namespace std;
int main(int argc, char *argv[])
{
unsigned char mystring[]="123456789abcdef";
unsigned char *key=&mystring[0];
int n=sizeof(mystring)/sizeof(mystring[0]);//length of mystring
cout<<oat_hash(key,n)<<endl;
//system("PAUSE");
//return EXIT_SUCCESS;
return 0;
}
这个哈希函数的名称是所谓的一次性哈希(Bob Jenkins)我有一个问题,这个代码的一小部分是正确的吗?
int n=sizeof(mystring)/sizeof(mystring[0]);//length of mystring
因为mysting没有内置函数长度,我使用了这个
答案 0 :(得分:3)
在这种情况下,是的 - 但它非常脆弱。例如,如果您更改了以下定义:
unsigned char mystring[]="123456789abcdef";
要:
unsigned char *mystring="123456789abcdef";
找到长度的方法会产生完全错误的结果。另请注意,由于您的字符串由char
组成,因此/sizeof(mystring[0])
也不是必需的 - sizof(char) == 1
(signed char
或{{1}相同}})。
您通常希望使用unsigned char
。
答案 1 :(得分:1)
是的,你的代码是正确的。您可能希望与数据类型进行比较:
int n=sizeof(mystring) / sizeof(char); //length of mystring
请注意,此仅在字符串不是动态时才有效。
否则使用strlen
表示c风格的字符串。
我必须说,但是,C ++的std::string
确实具有length
方法,并且在大多数情况下更容易使用 - 尤其是在使用它们时STL。
答案 2 :(得分:0)
是的,我觉得代码可以正常工作。但是请确保如果通过方法传递字符串数组,则由于在指针隐式传递的函数中传递数组,因此无法获得所需的结果。那段时间你的代码可以提供灾难。其他明智的做法很好。另一种可以找到字符串数组长度的方法如下:
int len = 0;
int iCount = 0;
while (mystring[iCount].empty() != true)
{
iCount++;
len++;
}
然后使用len作为String数组的长度
希望这会有所帮助。