C# 不安全代码翻译?

3

我有一些在标准C#应用程序中使用的代码。

我正在在Silverlight项目中共享这个库,但Silverlight不允许使用不安全的代码。我对不安全/指针逻辑/算术一无所知,想知道是否有人能够将以下代码片段翻译成不需要使用/unsafe的代码,虽然客户端很少调用该代码,但我不关心性能下降。感谢您提前的帮助。

    public static unsafe int GeStableHash(string name)
    {
        fixed (char* str = name)
        {
            char* chPtr = str;
            int num = 352654597;
            int num2 = num;
            int* numPtr = (int*)chPtr;
            for (int i = name.Length; i > 0; i -= 4)
            {
                num = (((num << 5) + num) + (num >> 27)) ^ numPtr[0];
                if (i <= 2)
                {
                    break;
                }
                num2 = (((num2 << 5) + num2) + (num2 >> 27)) ^ numPtr[1];
                numPtr += 2;
            }
            return (num + (num2 * 1566083941));
        }
    }

根据下面的回复,我查看了此函数的Silverlight实现。
现在我更加困惑了。在SL mscorlib.dll的string.GetHashCode函数中,我看到的代码如下(它使用了unsafe关键字,并在Visual Studio中出现语法错误!):
[SecuritySafeCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public unsafe override int GetHashCode()
{
    IntPtr arg_0F_0;
    IntPtr expr_06 = arg_0F_0 = this;
    if (expr_06 != 0)
    {
        arg_0F_0 = (IntPtr)((int)expr_06 + RuntimeHelpers.OffsetToStringData);
    }
    char* ptr = arg_0F_0;
    int num = 352654597;
    int num2 = num;
    int* ptr2 = (int*)ptr;
    int i;
    for (i = this.Length; i > 2; i -= 4)
    {
        num = ((num << 5) + num + (num >> 27) ^ *ptr2);
        num2 = ((num2 << 5) + num2 + (num2 >> 27) ^ ptr2[(IntPtr)4 / 4]);
        ptr2 += (IntPtr)8 / 4;
    }
    if (i > 0)
    {
        num = ((num << 5) + num + (num >> 27) ^ *ptr2);
    }
    return num + num2 * 1566083941;
}

解决方案可以在这里找到: https://codereview.stackexchange.com/questions/7661/c-unsafe-code-translation

这个问题可能更适合于代码审查:http://codereview.stackexchange.com/ - apiguy
3个回答

1

看起来这是GetHashCode的实现

所以也许你不需要做任何"datatohash"。GetHashCode();就足够了


难道没有任何警告表明GethashCode不能保证在各种系统中具有相同的实现吗?我想,如果我明确定义该方法,那么我就可以确保实现是一致的。我的理解是否正确? - user1142433
不确定你从哪里听到/看到的,提供一个参考会更好。 - Shaun Wilde
2
".NET Framework不能保证GetHashCode方法的默认实现,并且它返回的值将在不同版本的.NET Framework之间保持相同。" http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx - user1142433
不,我以前没有用过那些。我会谷歌一下,看看能找到什么。谢谢! - user1142433
是的,我正在一个64位的.NET服务器和Silverlight客户端之间传递它们。 - user1142433
显示剩余3条评论

1

您发布的哈希码实现使用指针算术以获得更好的性能。如果您将其放入带有“允许不安全代码”选项的.NET Framework项目中,则可以在Visual Studio中编译。

通过直接索引字符串,也可以使用相同的逻辑计算出相同的结果。例如,表达式"Hello, World"[7]的值为'W'

我将把翻译留给读者作为一种谚语式的练习。


0

为什么不使用MD5哈希之类的东西呢?它很稳定,并且在许多地方都有实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接