gpt4 book ai didi

c# - 重复调用HashCode.Combine

转载 作者:行者123 更新时间:2023-12-02 05:54:12 34 4
gpt4 key购买 nike

重复调用HashCode.Combine是否正确?

我正在尝试创建一个通用扩展方法,通过组合所有属性的哈希码来生成对象哈希码,如下所示:

using System;
public static int GetCombinedPropertiesHashCode(this object obj)
{
int hash = obj.GetType().GetHashCode();
foreach (var property in obj.GetType().GetProperties()) hash=HashCode.Combine(hash, property.GetHashCode());
return hash;
}

我不确定像这样累积哈希码是否会产生唯一的哈希值?如果不是,我怎样才能正确地做到这一点?

最佳答案

Is it correct to repeatedly call HashCode.Combine ?

是的。这正是它的用途。

I am trying to create a general extension method to produce an object hashcode from combining the hashcodes of all its properties

这是一件奇怪的事情。您的哈希码是每个类型,而不是每个对象,因此您的方法采用一个对象是很奇怪的。为什么它不简单地采用一种类型?为什么基于属性信息对象的哈希值形成类型的哈希值很有用?该哈希码没有特别有趣的特征,因此组合起来很有用。

你能解释一下你想在这里做什么吗? 这段代码看起来非常错误。不是因为你使用了组合器;而是因为你使用了组合器。因为你正在做这件事并且认为这会产生一些有用的东西。哈希码通常与等式配对,但属性信息是引用相等的。这段代码对我来说毫无意义。

更新:原始发布者相信,检查属性(property)的属性(property)信息可以为您提供属性(property)的值(value)。这种信念是错误的。因此我感到困惑。 (我不清楚这种信念如何在代码测试中幸存下来,甚至一次;也许原始发布者尚未运行此代码。)

I am not sure if accumulating hashcodes like this will produce a unique hash ?

它绝对不会产生唯一的哈希。哈希码是32位整数;数量只有四十亿!有超过四十亿种可能的类型,因此绝对至少有两种类型给出相同的哈希码。

哈希码的目的不是提供唯一值。如果您需要唯一值,请创建一个 GUID。如果您需要唯一的哈希值,请使用超过 32 位的加密强度哈希值。

由于所谓的“生日悖论”,你很快就会发生碰撞。我在这里绘制了您的算法产生非唯一结果的概率:https://ericlippert.com/2010/03/22/socks-birthdays-and-hash-collisions/

再说一次,如果您认为哈希代码是唯一的,那么听起来您对哈希代码做了一些非常错误的事情

您能更详细地解释一下您在这里做什么吗?您的问题就是我们所说的“XY”问题。你有一些真正的问题,你对如何解决它有一个疯狂的想法,现在你问一个关于这个疯狂想法的问题,但它没有任何意义。提出有关实际问题的问题;有更好的方法来解决这个问题。

关于c# - 重复调用HashCode.Combine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092243/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com