C#不安全的代码翻译
本文关键字:翻译 代码 不安全 | 更新日期: 2023-09-27 18:20:08
我有一些代码正在标准C#应用程序中使用。
我正在Silverlight项目中共享库,该项目不允许使用不安全的代码。我对unsafe/pointer逻辑/算术一无所知,我想知道是否有人能翻译下面的代码片段,使其在没有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字符串中看到的代码。GetHashCode函数如下(它在Visual Studio中使用了unsafe关键字并给出语法错误!):
[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
看起来这是GetHashCode 的实现
因此,也许您不需要做任何"datatohash"操作。GetHashCode();将满足
您发布的哈希代码实现使用指针算术以获得更好的性能。如果您将它放在带有"允许不安全代码"选项的.NET Framework项目中,它将在Visual Studio中编译。
通过使用相同的逻辑,但直接对字符串进行索引,可以计算出相同的结果。例如,表达式"Hello, World"[7]
的计算结果为'W'
。
我将把翻译本身作为谚语练习留给读者。
为什么不做一些类似MD5哈希的操作?它是稳定的,并在各个地方实施。