標準のC#アプリケーションで使用しているコードがあります。C#安全でないコード変換?
安全でないコードを許可しないSilverlightプロジェクトでライブラリを共有しています。私は安全でない/ポインタのロジック/算術についてはあまり知らないし、誰かが次のコードスニペットを翻訳して/安全でない状態で実行できるかどうか疑問に思っていた。コードがクライアント上で頻繁に呼び出されることはないため、パフォーマンスの低下は気にしません。ご協力いただきましてありがとうございます。
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機能で見たコードは(それが危険なキーワードを使用して、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
この質問は、Code Reviewに適しているかもしれません。http://codereview.stackexchange.com/ – apiguy
それが存在しなかったかどうかわかりませんでした。ありがとう。 :D – user1142433