在Python中,我知道__hash__为给定对象返回的值在该对象的生命周期内应该是相同的。但是,出于好奇,如果不是,会发生什么?这会造成什么样的破坏?classBadIdea(object):def__hash__(self):returnrandom.randint(0,10000)我知道__contains__和__getitem__会表现得很奇怪,因此dicts和set会表现得很奇怪。您也可能会在dict/set中得到“孤立”值。还会发生什么?它会导致解释器崩溃,还是破坏内部结构? 最佳答案 您的主要问题确实是字典和集合。如
一些哈希表方案,如cuckoohashing或dynamicperfecthashing,依赖universalhashfunctions的存在以及通过从通用哈希函数系列中选择一个新的哈希函数来收集显示冲突的数据并解决这些冲突的能力。前段时间,我试图在Java中实现一个由cuckoo哈希支持的哈希表,但遇到了麻烦,因为虽然所有Java对象都有一个hashCode函数,但hashCode返回对于每个对象都是固定的(当然,除非对象发生变化)。这意味着如果用户不提供通用散列函数的外部系列,就不可能构建依赖于通用散列的散列表。最初我认为我可以通过将通用哈希函数直接应用于对象的hashCode来
一些哈希表方案,如cuckoohashing或dynamicperfecthashing,依赖universalhashfunctions的存在以及通过从通用哈希函数系列中选择一个新的哈希函数来收集显示冲突的数据并解决这些冲突的能力。前段时间,我试图在Java中实现一个由cuckoo哈希支持的哈希表,但遇到了麻烦,因为虽然所有Java对象都有一个hashCode函数,但hashCode返回对于每个对象都是固定的(当然,除非对象发生变化)。这意味着如果用户不提供通用散列函数的外部系列,就不可能构建依赖于通用散列的散列表。最初我认为我可以通过将通用哈希函数直接应用于对象的hashCode来
在任何情况下,类实现其equals()是有意义的吗?和hashCode()方法使用不同的类字段集?我问是因为我对Netbeans感到困惑equals()和hashCode()生成器,要求您分别选择要包含在每个方法中的字段。我总是为这两种方法选择相同的字段,但是否存在不正确选择的情况? 最佳答案 好吧,equals()必须使用hashCode()使用的所有字段,否则你会得到不同的相等哈希码对象。但反过来则不然-您可以在选择哈希码时选择不考虑某个特定字段。这样,您最终可能会为两个不相等的对象获得相同的哈希码,这两个对象的区别仅在于“未使
在任何情况下,类实现其equals()是有意义的吗?和hashCode()方法使用不同的类字段集?我问是因为我对Netbeans感到困惑equals()和hashCode()生成器,要求您分别选择要包含在每个方法中的字段。我总是为这两种方法选择相同的字段,但是否存在不正确选择的情况? 最佳答案 好吧,equals()必须使用hashCode()使用的所有字段,否则你会得到不同的相等哈希码对象。但反过来则不然-您可以在选择哈希码时选择不考虑某个特定字段。这样,您最终可能会为两个不相等的对象获得相同的哈希码,这两个对象的区别仅在于“未使
Objectjavadocs和JoshBloch告诉我们很多关于应该如何实现hashCode/equals的内容,好的IDE将正确处理各种类型的字段。一些关于here的讨论.这个问题是关于下一步的:你如何确保它们保持良好?特别是,我觉得对于大多数类,equals/hashCode应该按照Bloch的建议实现(以及Eclipse和其他IDE的实现),并考虑到该类上所有非派生的业务逻辑字段。在为类添加新字段作为后续工作的一部分时,人们经常忘记将它们添加到equals/hashCode实现中。这可能会导致难以发现的错误,即两个对象看起来相等,但实际上不同之处在于最近引入的字段的值。当成员字段
Objectjavadocs和JoshBloch告诉我们很多关于应该如何实现hashCode/equals的内容,好的IDE将正确处理各种类型的字段。一些关于here的讨论.这个问题是关于下一步的:你如何确保它们保持良好?特别是,我觉得对于大多数类,equals/hashCode应该按照Bloch的建议实现(以及Eclipse和其他IDE的实现),并考虑到该类上所有非派生的业务逻辑字段。在为类添加新字段作为后续工作的一部分时,人们经常忘记将它们添加到equals/hashCode实现中。这可能会导致难以发现的错误,即两个对象看起来相等,但实际上不同之处在于最近引入的字段的值。当成员字段
我们正在编写一个需要非常复杂的逻辑来计算equals()和hashCode()的类。类似的东西:@Getters@Setters@FieldDefaults(level=AccessLevel.PRIVATE)publicclassExternalData{TypeEnumtype;Stringdata;Listchildren;}我们不构造这些对象,它们是从外部复杂系统的XML反序列化的。有20多种类型,根据类型,可以忽略数据,或者使用子节点处理,或者不处理子节点,每种节点的数据比较取决于类型。我们创建了equals()和hashCode()来反射(reflect)所有这些规则,但最
我们正在编写一个需要非常复杂的逻辑来计算equals()和hashCode()的类。类似的东西:@Getters@Setters@FieldDefaults(level=AccessLevel.PRIVATE)publicclassExternalData{TypeEnumtype;Stringdata;Listchildren;}我们不构造这些对象,它们是从外部复杂系统的XML反序列化的。有20多种类型,根据类型,可以忽略数据,或者使用子节点处理,或者不处理子节点,每种节点的数据比较取决于类型。我们创建了equals()和hashCode()来反射(reflect)所有这些规则,但最
我想知道是否有人可以详细解释一下(int)(l^(l>>>32));在下面的hashcode实现中做(由eclipse生成,但与EffectiveJava相同):privateinti;privatecharc;privatebooleanb;privateshorts;privatelongl;privatedoubled;privatefloatf;@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+i;result=prime*result+s;result=prime*res