计算unsigned char的长度

时间:2012-03-16 06:00:08

标签: c++ hash

这里我有用于计算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没有内置函数长度,我使用了这个

3 个答案:

答案 0 :(得分:3)

在这种情况下,是的 - 但它非常脆弱。例如,如果您更改了以下定义:

unsigned char mystring[]="123456789abcdef";

要:

unsigned char *mystring="123456789abcdef";

找到长度的方法会产生完全错误的结果。另请注意,由于您的字符串由char组成,因此/sizeof(mystring[0])也不是必需的 - sizof(char) == 1signed char或{{1}相同}})。

您通常希望使用unsigned char

答案 1 :(得分:1)

是的,你的代码是正确的。您可能希望与数据类型进行比较:

int n=sizeof(mystring) / sizeof(char); //length of mystring

请注意,此仅在字符串不是动态时才有效。 否则使用strlen表示c风格的字符串。

我必须说,但是,C ++的std::string 确实具有length方法,并且在大多数情况下更容易使用 - 尤其是在使用它们时STL。

此外,boost can do C++ string hashes

答案 2 :(得分:0)

是的,我觉得代码可以正常工作。但是请确保如果通过方法传递字符串数组,则由于在指针隐式传递的函数中传递数组,因此无法获得所需的结果。那段时间你的代码可以提供灾难。其他明智的做法很好。另一种可以找到字符串数组长度的方法如下:

int len = 0;
int iCount = 0;
while (mystring[iCount].empty() != true)
{
      iCount++;
      len++;
}

然后使用len作为String数组的长度

希望这会有所帮助。