将 C# 哈希函数转换为C++

Converting C# hash function to C++

本文关键字:C++ 转换 函数 哈希      更新时间:2023-10-16

我在C#中有这个函数:

public static unsafe int GetMonoHash(string str) {
unsafe {
fixed (char* src = str) {
char* chPtr2 = src; // + offset;
char* chPtr3 = (chPtr2 + str.Length) - 1;
int num = 0;
while (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
num = ((num << 5) - num) + chPtr2[1];
chPtr2 += 2;
}
chPtr3++;
if (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
}
return num;
}
}
}

我试图用C++重写它,我走到了这一步:

int Utils::getMonoHash(std::string str)
{
char* src = &str[0];
char* chPtr2 = src; // + offset;
->  char* chPtr3 = (chPtr2 + str.length) - 1;
int num = 0;
while (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
num = ((num << 5) - num) + chPtr2[1];
chPtr2 += 2;
}
chPtr3++;
if (chPtr2 < chPtr3) {
num = ((num << 5) - num) + chPtr2[0];
}
return num; 
}

这引发了编译错误:

C3867 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::length': non-standard syntax; use '&' to create a pointer to member
C2297 '+': illegal, right operand has type 'unsigned __int64 (__cdecl std::basic_string<char,std::char_traits<char>,std::allocator<char>>::* )(void) noexcept const'

所以我将指示的 (->( 行更改为

char* chPtr3 = (chPtr2 + (char *)str.length) - 1;

这给了我一个新的编译错误(这次只有一个,耶!

C2440 'type cast': cannot convert from 'unsigned __int64 (__cdecl std::basic_string<char,std::char_traits<char>,std::allocator<char>>::* )(void) noexcept const' to 'char *'

我不知道现在该怎么办。当给定与 C# 函数相同的输入时,我需要 C++ 函数具有与 C# 函数相同的输出。

我在这里做什么?

str.length 不是一个属性,它是一个函数,需要 ((

根据我作为 C# 程序员的经验,这是 C# 程序员在编写C++时最常犯的错误之一。

不要忘记 str.length 后面的括号。正确的类型应该是这样的

char* chPtr3 = (chPtr2 + str.length()) - 1;

你做什么?你停止"翻译",就好像C++和 C# 有什么共同点一样,而是使用你的基本需求和你的C++书作为指导从头开始编写。

在这种情况下,您的问题是您错误地使用了成员函数。这是str.length().编译器的抱怨是关于错误地使用函数名称,而没有实际调用它。