假设我有一本字典:>>>d={}它有一个方法clear():>>>d.clear...具有__hash__属性:>>>d.clear.__hash__...这是可调用的:>>>callable(d.clear.__hash__)True那为什么我不能散列呢?>>>hash(d.clear)Traceback(mostrecentcalllast):File"",line1,inTypeError:unhashabletype:'dict'注意:我知道dict对象是不可散列的——我很好奇为什么这个限制会扩展到它们的方法,尽管如上所述,它们出现否则claim?
我经常使用时髦的东西作为字典的键,因此,我想知道正确的方法是什么-这通过为我的对象实现良好的哈希方法。我知道这里提出的其他问题,例如goodwaytoimplementhash,但我想了解默认__hash__如何用于自定义对象,以及是否可以依赖它。我注意到可变对象是明确不可散列的,因为hash({})会引发错误......但奇怪的是,自定义类是可散列的:>>>classObject(object):pass>>>o=Object()>>>hash(o)那么,有人知道这个默认哈希函数是如何工作的吗?通过了解这一点,我想知道:如果我将相同类型的对象作为字典的键,我可以依赖这个默认哈希吗?例
我正在尝试计算文件的SHA-1值。我编造了这个脚本:defhashfile(filepath):sha1=hashlib.sha1()f=open(filepath,'rb')try:sha1.update(f.read())finally:f.close()returnsha1.hexdigest()对于一个特定的文件,我得到这个哈希值:8c3e109ff260f7b11087974ef7bcdbdc69a0a3b9但是当我用githash_object计算值时,我得到这个值:d339346ca154f6ed9e92205c3c5c38112e761eb7它们为什么不同?我做错了什么
我一直在玩Python的hashfunction.对于小整数,它总是出现hash(n)==n。然而,这并没有扩展到大量:>>>hash(2**100)==2**100False我并不感到惊讶,我知道hash的取值范围是有限的。这个范围是多少?我尝试使用binarysearch找到最小的数字hash(n)!=n>>>importcodejamhelpers#pipinstallcodejamhelpers>>>help(codejamhelpers.binary_search)Helponfunctionbinary_searchinmodulecodejamhelpers.binary
实现__hash__()的正确好方法是什么?我说的是返回哈希码的函数,该哈希码随后用于将对象插入哈希表(也称为字典)中。由于__hash__()返回一个整数并用于将对象“分箱”到哈希表中,我假设返回的整数值应该均匀分布在公共(public)数据中(以尽量减少冲突)。获得这些值的好习惯是什么?碰撞有问题吗?就我而言,我有一个小类,它充当容器类,包含一些整数、一些float和一个字符串。 最佳答案 实现__hash__()的一种简单、正确的方法是使用键元组。它不会像专门的哈希那样快,但如果你需要,那么你可能应该在C中实现该类型。下面是一
有人可以向我解释一下静态HashMap#hash(int)方法吗?生成均匀分布的哈希的理由是什么?/***AppliesasupplementalhashfunctiontoagivenhashCode,which*defendsagainstpoorqualityhashfunctions.Thisiscritical*becauseHashMapusespower-of-twolengthhashtables,that*otherwiseencountercollisionsforhashCodesthatdonotdiffer*inlowerbits.Note:Nullkeysa
我最近发现了Objects.hash()方法。我的第一个想法是,这会大大整理您的hashCode()实现。请参阅以下示例:@Override//traditionalpublicinthashCode(){inthash=5;hash=67*hash+(int)(this.id^(this.id>>>32));hash=67*hash+(int)(this.timestamp^(this.timestamp>>>32));hash=67*hash+Objects.hashCode(this.severity);hash=67*hash+Objects.hashCode(this.thr
我在其他帖子中读到这似乎是组合散列值的最佳方式。有人可以分解一下并解释为什么这是最好的方法吗?templateinlinevoidhash_combine(std::size_t&seed,constT&v){std::hashhasher;seed^=hasher(v)+0x9e3779b9+(seed>2);}编辑:另一个问题只是询问魔数(MagicNumber),但我想了解整个功能,而不仅仅是这一部分。 最佳答案 “最好”是有争议的。“好”,甚至“非常好”,至少在表面上,很容易。seed^=hasher(v)+0x9e3779
最近发现C++中hashmap的实现会叫unordered_map。当我查看他们为什么不只是使用hash_map时,我发现显然hash_map的实现存在兼容性问题,即unordered_map解析(更多关于它here)。那个wiki页面没有提供更多信息,所以我想知道是否有人知道unordered_map解决的hash_map的一些问题。 最佳答案 由于C++标准库中没有定义哈希表,标准库的不同实现者会提供一个非标准的哈希表,通常命名为hash_map。因为这些实现不是按照标准编写的,所以它们在功能和性能保证方面都有细微的差别。从C+
我发现VS2005上的标准散列函数在尝试实现高性能查找时非常缓慢。有哪些快速高效的散列算法可以避免大多数冲突的好例子? 最佳答案 我曾与PaulLarson合作过微软研究院的一些哈希表实现。他在各种数据集上研究了许多字符串散列函数,发现简单的乘以101和加法循环的效果出奇的好。unsignedinthash(constchar*s,unsignedintseed=0){unsignedinthash=seed;while(*s){hash=hash*101+*s++;}returnhash;}