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