2012-01-11 18 views
3

標準の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

+0

この質問は、Code Reviewに適しているかもしれません。http://codereview.stackexchange.com/ – apiguy

+0

それが存在しなかったかどうかわかりませんでした。ありがとう。 :D – user1142433

答えて

1

これはので、おそらくあなたは何も「datatohash」.GetHashCode()を行う必要はありませんGetHashCode

の実装であるように見えます。十分です。

+0

GethashCodeはさまざまなシステム間で同じ実装を使用することができないという警告はありませんか?私は明示的にメソッドを定義すると、実装が一貫していることを確信できます。私は間違って理解していますか? – user1142433

+0

どこに聞いたか分かりませんが、参考になると良いでしょう。 –

+2

".NET FrameworkではGetHashCodeメソッドの既定の実装が保証されておらず、返される値は.NET Frameworkのさまざまなバージョン間で同じになります」http://msdn.microsoft.com/en-us/ library/system.object.gethashcode.aspx – user1142433

1

あなたが投稿したハッシュコードの実装は、より良いパフォーマンスのためにポインタ演算を使用します。 「安全でないコードを許可する」オプションを使用して.NET Frameworkプロジェクトに配置すると、Visual Studioでコンパイルされます。

同じロジックを使用して同じ結果を計算できますが、文字列を直接インデックスすることができます。たとえば、式"Hello, World"[7]は、'W'と評価されます。

私は読者のための言葉の練習として翻訳自体を残します。

0

MD5ハッシュのようにしてみませんか?安定しており、さまざまな場所で実装されています。

関連する問題