1

我正在尝试将字符串转换为无符号字符 *。我一直在兜圈子。我的程序提示用户输入我作为字符串输入的姓氏。然后我使用 djb2 将字符串散列成一个整数。它将 unsigned char * 作为参数。我的程序的目标是使用链接创建一个哈希表来处理冲突。

unsigned long djb2(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

我的代码如下atm。

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize)
{
    char * cstr;
    string str;
    cin >> str;
    cstr = new char [str.size()+1];
    strcpy (cstr, str.c_str());
    int hashBucket1 = djb2(cstr) % listSize;
}

我收到一个错误,上面告诉我““char *”类型的参数与“unsigned char *”类型的参数不兼容。非常感谢任何帮助

4

2 回答 2

4

当您遇到这样的打字问题时,这很好地表明您没有以最佳方式使用该语言。在 C++ 中的字符串和 char*s 之间来回切换是一种不好的代码气味

修改dbjc为使用字符串:

unsigned long djb2(const string& str)
{
    unsigned long hash = 5381;

    for(string::iterator it=str.begin();it!=str.end();it++) 
        hash = ((hash << 5) + hash) + *it; /* hash * 33 + character */

    return hash;
}

这将大大简化您的插入:

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize){
    string str;
    cin >> str;
    int hashBucket1;
    hashBucket1 = djb2(str) % listSize;
}
于 2012-05-26T18:54:03.047 回答
0

最好的解决方案是修改dbjc功能,正如@Steven Burnap 所建议的那样。

如果您无法更改,请在通话中进行dbjc转换:cstrunsigned char *dbjc

void insert(LinkedList<Person>* HashList1[], LinkedList<Person>* HashList2[], int listSize){
        char * cstr;
        string str;
        cin >> str;
        cstr = new char [str.size()+1];
        strcpy (cstr, str.c_str());
        int hashBucket1;
        hashBucket1 = djb2((unsigned char *)cstr) % listSize; // <-- here is the change
}
于 2012-05-26T19:04:27.523 回答