下面是 C# 中 GetHashCode32 方法的代码:
public static class StringHelper
{
public static unsafe int GetHashCode32(this string s)
{
fixed (char* str = s.ToCharArray())
{
char* chPtr = str;
int num = 0x15051505;
int num2 = num;
int* numPtr = (int*)chPtr;
for (int i = s.Length; i > 0; i -= 4)
{
num = ( ( (num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
if (i <= 2)
{
break;
}
num2 = ( ( (num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
numPtr += 2;
}
return (num + (num2 * 0x5d588b65));
}
}
}
我用 C 语言重写了这个方法,如下所示:
#include <stdio.h>
#include <string.h>
int main()
{
char str[320+1];
memset(str, 0, sizeof(str));
int i;
scanf("%s", str);
char *chPtr = str;
int num = 0x15051505;
int num2 = num;
int *numPtr = (int*)chPtr;
for (i = strlen(str); i > 0; i -= 4) {
num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
if (i <= 2)
{
break;
}
num2 = ( ( (num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
numPtr += 2;
}
printf("hash code: %d\n", num + (num2 * 0x5d588b65));
return 0;
}
c代码在-m32模式下编译。 但这两个功能有不同的输出
当输入为“354707043566597”时
我的 c 代码输出是 637077169,而在 GetHashCode32() 中它应该是 -1744455423。
GetHashCode32 是 C# 的库方法。所以是对的。但我不知道我的 C 代码有什么问题。谢谢!