Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Double.GetHashCode算法或重写_C#_Algorithm_Double_Gethashcode - Fatal编程技术网

C# Double.GetHashCode算法或重写

C# Double.GetHashCode算法或重写,c#,algorithm,double,gethashcode,C#,Algorithm,Double,Gethashcode,我有一个托管和非托管代码都可以运行的应用程序项目,我需要在两个系统中使用相同的算法对双值进行散列。因此,我将重写Syt.Dig.GethAsHeCudie()或在C++代码中使用其算法。我找不到double.gethashcode算法,决定重写该函数。但我犯了一个奇怪的错误 无法隐式转换类型double 到系统,加倍 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text

我有一个托管和非托管代码都可以运行的应用程序项目,我需要在两个系统中使用相同的算法对双值进行散列。因此,我将重写Syt.Dig.GethAsHeCudie()或在C++代码中使用其算法。我找不到double.gethashcode算法,决定重写该函数。但我犯了一个奇怪的错误

无法隐式转换类型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行,我将无法将类型double隐式转换为System.double 错误。如果运行第1行,则不会发生错误,但重写的代码永远不会工作

也许这是我正在尝试的一件非常糟糕的事情。因此,任何人都知道关于双.GethAHAc码算法,所以我可以编写等价的C++代码来获得精确的int值?
public struct Double

这是第一个问题。您不能重新定义预定义类型(除非…。

这是我在
Double.GetHashCode()中看到的:


使用扩展方法,Luke。

自定义双精度类型有两个问题:

  • 它不包含任何数据
  • 它不转换为双精度
    和双精度
第一个问题的解决方法是在结构中使用类型为
double
的私有变量

第二种是通过使用隐式转换器来解决的

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

我试过使用关键词parial(如果你是这个意思的话)。它也不起作用。除非您提供了自己的.NET运行时,否则无法重新定义基元类型,并且仍然有一个正在运行的程序。许多散列集合确实提供了向其中传递自定义散列函数的功能。@leppie,您是否错过了OP问题中他问的部分,“也许这是我正在尝试的一件非常糟糕的事情。因此,任何人都知道双GethHAc码算法,所以我可以编写等效的C++代码来获得精确的int值。“这与我在问题中使用的算法相同。哈哈,我必须耐心地在一些函数中尝试代码,并将结果与gethashcode进行比较。谢谢,Kirk:)这适用于当前的实现,但是您应该谨慎地考虑实现细节,因为它们可能会发生变化。在架构之间共享哈希代码时,最好使用独立于任何平台的算法。当然,您可以使用与当前实现相同的算法,但是您应该模仿它,而不是使用内置方法。这是一个很好的建议,但是与不安全的版本相比,您的gethashcode似乎要慢一些。也许在我的应用程序中,一秒钟内会有上万次哈希运算。我需要速度。用户还将编写自定义c#代码。因此,他们将不得不使用“CustomDouble”而不是“double”这个名称。但是还是要谢谢。@bahadir:如果你需要速度,你当然可以使用不安全的版本,我只是加入了一个,以表明它可以很容易地完成,而不需要。类似地,我将类命名为
CustomDouble
,以将其与内置类型分开,因为您在尝试替换这些类型时应该小心。您可以替换
Double
名称,但仍然无法更改
dobule
关键字的含义。
// 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