2

マネージ コードとアンマネージ コードの両方を実行するアプリケーション プロジェクトがあり、両方のシステムで double 値をハッシュするために同じアルゴリズムを使用する必要があります。そのため、System.Double.GetHashCode() をオーバーライドするか、C++ コードでそのアルゴリズムを使用します。double.gethashcode アルゴリズムが見つからず、関数をオーバーライドすることにしました。しかし、奇妙なエラーが発生しました。

double 型を System.Double に暗黙的に変換することはできません

コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace System
{
  public struct Double
  {
    unsafe public override int GetHashCode()
    {
      fixed (Double* dd = &this)
      {
        int* xx = (int*)dd;
        return xx[0] ^ xx[1] ;
      }

    }
  }
}

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      double dd = 123.3444; // line 1
      // Double dd = 123.3444; // line 2
      // Cannot implicitly convert type double to System.Double
      Console.WriteLine(dd.GetHashCode());

      Console.ReadLine();
    }
  }
}

行 2 のコメントを外すと、Cannot implicitly convert type double to System.Double エラーが発生します。1行目を実行してもエラーは発生しませんが、オーバーライドされたコードは機能しません。

多分それは私がしようとしている非常に悪いことです。誰でも double.gethashcode アルゴリズムについて知っているので、同等の C++ コードを記述して正確な int 値を取得できますか?

4

4 に答える 4

9

これは私が見るものですDouble.GetHashCode()

//The hashcode for a double is the absolute value of the integer representation
//of that double.
// 
[System.Security.SecuritySafeCritical]  // auto-generated
public unsafe override int GetHashCode() { 
    double d = m_value; 
    if (d == 0) {
        // Ensure that 0 and -0 have the same hash code 
        return 0;
    }
    long value = *(long*)(&d);
    return unchecked((int)value) ^ ((int)(value >> 32)); 
}
于 2010-10-24T16:58:42.170 に答える
5
public struct Double

それが最初の問題です。定義済みの型を再定義することはできません (... を除く)。

于 2010-10-24T16:54:04.087 に答える
2

カスタム double 型には 2 つの問題があります。

  • データは含まれていません。
  • との間の変換は行いませんdouble

double1 つ目は、構造体に型のプライベート変数を含めるだけで解決されます。

2 つ目は、暗黙的なコンバーターを使用して解決されます。

public struct CustomDouble {

  private double _value;

  public override int GetHashCode() {
    byte[] data = BitConverter.GetBytes(_value);
    int x = BitConverter.ToInt32(data, 0);
    int y = BitConverter.ToInt32(data, 4);
    return x ^ y;
  }

  public static implicit operator double(CustomDouble d) {
    return d._value;
  }

  public static implicit operator CustomDouble(double d) {
    return new CustomDouble() { _value = d };
  }

}

例:

// Use the conversion from double to CustomDouble
CustomDouble d = 3.14;

// Use the CustomDouble.GetHashCode method:
Console.WriteLine(d.GetHashCode()); // 300063655

// Use the conversion from CustomDouble to double:
Console.WriteLine(d); // 3.14
于 2010-10-24T17:44:46.147 に答える
1

拡張メソッドを使用してください、ルーク。

于 2010-10-24T16:59:48.853 に答える