计算无符号字符的长度

calculate length of unsigned char

本文关键字:字符 无符号 计算      更新时间:2023-10-16

这里有计算无符号字符哈希值的代码

#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;
}

这个散列函数的名字被称为One-at-a-Time散列(Bob Jenkins),我有一个问题,代码的这一小部分正确吗?

int n=sizeof(mystring)/sizeof(mystring[0]);//length of mystring

因为mysing没有内置函数长度,所以我使用了这个

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

unsigned char mystring[]="123456789abcdef";

收件人:

unsigned char *mystring="123456789abcdef";

你的长度计算方法会产生完全错误的结果。还要注意,由于字符串是由chars组成的,所以/sizeof(mystring[0])也不是真正必要的——sizof(char) == 1signed charunsigned char也是如此)。

您通常希望使用strlen

是的,您的代码是正确的。不过,您可能需要与数据类型进行比较:
int n=sizeof(mystring) / sizeof(char); //length of mystring

请注意,只有当字符串不是动态的时,此才有效。否则,对c样式字符串使用strlen

然而,我必须说,C++的std::string确实有一个length方法,并且在大多数情况下更容易使用,尤其是在将它们与STL一起使用时。

此外,boost可以进行C++字符串哈希

是的,我觉得代码会很好地工作。但请确保,如果您通过方法传递字符串的数组,它不会给您所需的结果,因为在由指针隐式传递的函数中传递数组。到那时,您的代码可能会带来灾难。从其他方面来说,这很好。你可以找到字符串数组长度的另一种方法是:

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

然后使用len作为字符串数组的长度

希望这会有所帮助。