C#是否可以为双精度值数组生成标识符
C# Is it possible to generate an identifier for array of double values
我正在处理现有数据并且有包含数组 double[23] 和 double[46] 的记录。数组中的值在多个记录中可以相同。我想生成一个 id(可能是一个 int)来唯一标识每个数组中的值。
在应用程序中的某些地方,我需要根据数组中相同的值对记录进行分组。虽然有很多方法可以查询这个,但我希望有一个 int 字段(或类似的东西)来分组。这确实有助于简化查询,尤其是对报表工具有帮助,在较小的单个字段上进行分组会大有帮助。
我想过生成一个散列码,但我知道对于每个具有匹配值的 double[],这些并不保证运行相同。我曾尝试实施
((IStructuralEquatable)combined).GetHashCode(EqualityComparer<double>.Default);
比较结构和数据,但同样,我不认为这是 gua运行teed 来匹配另一个具有相同值的 double[]。
也许某种形式的校验和可以工作,但不可否认我在实现某些东西时遇到了问题。我正在寻找 suggestions/direction.
这是 3 个示例记录的数据。记录 1 和 3 中的数据相同,因此生成的 ID 应该与它们匹配。
32.7,48.9,55.9,48.9,47.7,46.9,45.7,44.4,43.4,41.9,40.4,38.4,36.7,34.4,32.4,30.4,27.9,25.4,22.4,19.4,16.4,13.4,10.4,47.9
40.8,49.0,50.0,49.0,47.8,47.0,45.8,44.5,43.5,42.0,40.5,38.5,36.8,34.5,32.5,30.5,28.0,25.5,22.5,19.5,16.5,13.5,10.5,48.0
32.7,48.9,55.9,48.9,47.7,46.9,45.7,44.4,43.4,41.9,40.4,38.4,36.7,34.4,32.4,30.4,27.9,25.4,22.4,19.4,16.4,13.4,10.4,47.9
也许不检查所有数据是不可能的,但希望有更好的解决方案来简化应用程序并提高速度。
目标是在现有记录中添加一个新的id字段来表示数组数据。这样,将记录传递到报告工具中可以很容易地在一个字段上组合在一起,而不是检查每条记录的整个数组。
我很感激任何方向。
编辑 - 我 运行 尝试的一些问题(以防对某人有帮助)
为了最初理解这一点,我调用了这段代码(它是 .NET 的一部分)。我知道这些函数会将数组的 values 散列在一起(在这种情况下只有 8 个值)。我不认为它包括数组句柄。结果并不像预期的那样,因为根据下面的注释行在 .NET 中纠正了一个错误 MS。通过修复,我获得了更好的结果。
int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
if (comparer == null)
throw new ArgumentNullException("comparer");
Contract.EndContractBlock();
int ret = 0;
for (int i = (this.Length >= 8 ? this.Length - 8 : 0); i < this.Length; i++) {
ret = CombineHashCodes(ret, comparer.GetHashCode(GetValue(i)));
//.NET 4.6.2, in .NET 4.5.2 it is ret = CombineHashCodes(ret, comparer.GetHashCode(GetValue(0)))
}
return ret;
}
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
我对此进行了修改以处理超过 8 个值,但仍有一些哈希值不匹配。后来我确定问题出在数据中;我不知道有些记录有一些双精度存储超过一位小数(应该四舍五入)。这当然改变了哈希。现在我的数据是一致的,我看到了匹配的哈希值;任何具有相同值的数组都具有相同的散列。
I thought of generating a hash code, but I understand these are not guaranteed to be the same for each double[] with matching values
恰恰相反,设计要求哈希函数 return 相等输入的相等哈希值。例如,0
是散列函数的一个很好的起点,return 为相等的行设置值 0。其他一切都只是为了减少误报而进行的优化。
Perhaps this is not possible without just checking all the data
当然你需要检查所有的数据,否则你会怎么做?
但是你的实现有问题。数组的默认哈希函数对数组本身的句柄进行哈希处理,因此具有相同数据的数组的不同实例将显示为不同。您想要做的是使用 HashCode
实例和 Add()
数组中的每个元素来获得正确的哈希码。
我正在处理现有数据并且有包含数组 double[23] 和 double[46] 的记录。数组中的值在多个记录中可以相同。我想生成一个 id(可能是一个 int)来唯一标识每个数组中的值。
在应用程序中的某些地方,我需要根据数组中相同的值对记录进行分组。虽然有很多方法可以查询这个,但我希望有一个 int 字段(或类似的东西)来分组。这确实有助于简化查询,尤其是对报表工具有帮助,在较小的单个字段上进行分组会大有帮助。
我想过生成一个散列码,但我知道对于每个具有匹配值的 double[],这些并不保证运行相同。我曾尝试实施
((IStructuralEquatable)combined).GetHashCode(EqualityComparer<double>.Default);
比较结构和数据,但同样,我不认为这是 gua运行teed 来匹配另一个具有相同值的 double[]。
也许某种形式的校验和可以工作,但不可否认我在实现某些东西时遇到了问题。我正在寻找 suggestions/direction.
这是 3 个示例记录的数据。记录 1 和 3 中的数据相同,因此生成的 ID 应该与它们匹配。 32.7,48.9,55.9,48.9,47.7,46.9,45.7,44.4,43.4,41.9,40.4,38.4,36.7,34.4,32.4,30.4,27.9,25.4,22.4,19.4,16.4,13.4,10.4,47.9 40.8,49.0,50.0,49.0,47.8,47.0,45.8,44.5,43.5,42.0,40.5,38.5,36.8,34.5,32.5,30.5,28.0,25.5,22.5,19.5,16.5,13.5,10.5,48.0 32.7,48.9,55.9,48.9,47.7,46.9,45.7,44.4,43.4,41.9,40.4,38.4,36.7,34.4,32.4,30.4,27.9,25.4,22.4,19.4,16.4,13.4,10.4,47.9
也许不检查所有数据是不可能的,但希望有更好的解决方案来简化应用程序并提高速度。
目标是在现有记录中添加一个新的id字段来表示数组数据。这样,将记录传递到报告工具中可以很容易地在一个字段上组合在一起,而不是检查每条记录的整个数组。
我很感激任何方向。
编辑 - 我 运行 尝试的一些问题(以防对某人有帮助)
为了最初理解这一点,我调用了这段代码(它是 .NET 的一部分)。我知道这些函数会将数组的 values 散列在一起(在这种情况下只有 8 个值)。我不认为它包括数组句柄。结果并不像预期的那样,因为根据下面的注释行在 .NET 中纠正了一个错误 MS。通过修复,我获得了更好的结果。
int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
if (comparer == null)
throw new ArgumentNullException("comparer");
Contract.EndContractBlock();
int ret = 0;
for (int i = (this.Length >= 8 ? this.Length - 8 : 0); i < this.Length; i++) {
ret = CombineHashCodes(ret, comparer.GetHashCode(GetValue(i)));
//.NET 4.6.2, in .NET 4.5.2 it is ret = CombineHashCodes(ret, comparer.GetHashCode(GetValue(0)))
}
return ret;
}
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
我对此进行了修改以处理超过 8 个值,但仍有一些哈希值不匹配。后来我确定问题出在数据中;我不知道有些记录有一些双精度存储超过一位小数(应该四舍五入)。这当然改变了哈希。现在我的数据是一致的,我看到了匹配的哈希值;任何具有相同值的数组都具有相同的散列。
I thought of generating a hash code, but I understand these are not guaranteed to be the same for each double[] with matching values
恰恰相反,设计要求哈希函数 return 相等输入的相等哈希值。例如,0
是散列函数的一个很好的起点,return 为相等的行设置值 0。其他一切都只是为了减少误报而进行的优化。
Perhaps this is not possible without just checking all the data
当然你需要检查所有的数据,否则你会怎么做?
但是你的实现有问题。数组的默认哈希函数对数组本身的句柄进行哈希处理,因此具有相同数据的数组的不同实例将显示为不同。您想要做的是使用 HashCode
实例和 Add()
数组中的每个元素来获得正确的哈希码。