0

このモジュロには大きな問題があります。Cバージョンは私が望むものを出力しますが、正しい値ではありません。私のC#は、私が望んでいないものを出力しますが、正しい値です。C# バージョンを取得して C バージョンを出力するにはどうすればよいですか?

typedef unsigned long long u64;
typedef unsigned char u8;
static u64 pfd_calculate_hash_table_entry_index(const char *file_name) {
    u64 hash, len, i;

    if (!file_name)
        return -1;

    len = strlen(file_name);
    hash = 0;

    for (i = 0; i < len; ++i)
        hash = (hash << 5) - hash + (u8)file_name[i];
    printf( "%X ", hash);
    printf( "mod ");
    printf( "%X ", 0x39);
    printf( "= %X\n", hash % 0x39 );
    return hash % 0x39;
}

C#

public ulong pfd_calculate_hash_table_entry_index(char[] file_name)
{
    uint hash, len, i;
    hash = 0;
    len = (uint)Array.IndexOf(file_name, '\0');
    for (i = 0; i < len; ++i)
        hash = (hash << 5) - hash + (byte)file_name[i];
    MessageBox.Show(hash.ToString("X") + " mod 0x39 = " + (hash % 0x39).ToString("X"));
    return ((ulong)hash % 0x39);
}

C#

#1: char[] file_name = "PARAM.SFO";
#2: char[] file_name = "RAGE.SAV"

#1: char* file_name = "RAGE.SAV";
#2: char* file_name = "PARAM.SFO"

C ハッシュ

#1: 0x319FFDA7
#2: 0x1A8C4B5B

C# ハッシュ

#2: 0x319FFDA7
#1: 0x1A8C4B5B

C 出力

#1: 0x319FFDA7 % 0x39 = 0x21;
#2: 0x1A8C4B5B % 0x39 = 0x8;

C# 出力

#1: 0x319FFDA7 % 0x39 = 0xA;
#2: 0x1A8C4B5B % 0x39 = 0xE;

写真...

http://puu.sh/3dT5L/52ababeccf.png

C#

http://puu.sh/3dT6P/62b911c102.png

4

1 に答える 1