重新实现GetHashCode()

时间:2016-01-02 23:32:08

标签: c# string pointers gethashcode intptr

我正在Visual Studio 2015中编写一个配置文件编辑器,用于在Unity中编写的游戏。这意味着我的String.GetHashCode()和游戏String.GetHashCode()不一样。

我的想法是简单地找到游戏方法,然后使用它来获取我需要的任何字符串的哈希码。然而,事实证明这很困难。这是方法:

public unsafe int GetHashCode()
{
    IntPtr arg_0F_0;
    IntPtr expr_06 = arg_0F_0 = "test";
    if (expr_06 != 0)
    {
        arg_0F_0 = (IntPtr)((int)expr_06 + 12);
    }
    char* ptr = arg_0F_0;
    int num = 352654597;
    int num2 = num;
    int* ptr2 = (int*)ptr;
    for (int i = this.Length; i > 0; i -= 4)
    {
        num = ((num << 5) + num + (num >> 27) ^ *ptr2);
        if (i <= 2)
        {
            break;
        }
        num2 = ((num2 << 5) + num2 + (num2 >> 27) ^ ptr2[1]);
        ptr2 += 2;
    }
    return num + num2 * 1566083941;
}

我将第4行从this更改为"test",因此它不会抛出编译错误,无论如何它应该是一个字符串。但这不会编译,它给了我几个错误:

  1. IntPtr expr_06 = arg_0F_0 = "test";标有arg_0F_0 = "test"
  2. 无法转换来源类型&#39;字符串&#39;定位类型&#39; System.IntPtr&#39;

    1. if (expr_06 != 0)标有expr_06 != 0
    2. 运营商&#39;!=&#39;不能应用于类型&#39; System.IntPtr&#39;的操作数。和&#39; int&#39;

      这也引发了错误char* ptr = arg_0F_0;,但是当我使用此char* ptr = (char*) arg_0F_0;更改错误时它就消失了。

      那么,有什么想法吗?我如何使其工作?只要得到相同的结果,我就不在乎方法内部会发生什么。

0 个答案:

没有答案