计算无符号字符的长度
calculate length of 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;
}
这个散列函数的名字被称为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";
你的长度计算方法会产生完全错误的结果。还要注意,由于字符串是由char
s组成的,所以/sizeof(mystring[0])
也不是真正必要的——sizof(char) == 1
(signed char
或unsigned 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作为字符串数组的长度
希望这会有所帮助。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中