Delphi 2009 为 TObject 添加了 GetHashCode 函数。 GetHashCode 返回一个 Integer,用于 TDictionary 中的哈希。
如果您希望对象在 TDictionary 中正常工作,则需要适本地重写 GetHashCode,以便通常不同的对象返回不同的整数哈希代码。
但是对于包含双字段的对象该怎么办?如何将这些 double 值转换为 GetHashCode 的整数?
例如,在 Java 中通常完成的方式是使用 Double.doubleToLongBits 或 Float.floatToIntBits 等方法。后者的文档对其进行了如下描述:“根据 IEEE 754 浮点“单一格式”位布局返回指定浮点值的表示形式。”这涉及到对浮点值的不同位使用不同掩码的一些按位运算。
Delphi 中有这样做的函数吗?
最佳答案
我建议对 Gamecat 代码进行以下改进:
type
TVarRec = record
case Integer of
0: ( FInt1, FInt2 : Integer; )
1: ( FDouble : Double; )
end;
function Convert(const ADouble: Double): Integer;
var
arec : TVarRec;
begin
arec.FDouble := ADouble;
Result := arec.FInt1 xor arec.FInt2;
end;
这考虑了 Double 值的所有位。
(注释不能很好地与代码配合使用)
关于delphi - 在 Delphi 中将 GetHashCode 的 double 转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288176/