草庐IT

开散列

全部标签

c++ - 在 C++ 中实现 Hashmap::模板化数据类型的散列函数

我最近一直在使用STL的unordered_map,虽然它似乎工作得很好,但鉴于数据类型作为模板参数给出,我不太了解散列函数的工作原理。为了更彻底地理解这种数据结构,我用C++实现了自己的Hashmap小类:HashMap接口(interface):#ifndef_HASHMAP_H_#define_HASHMAP_H_#include#include#include#include#include//BeginningofHashmapclassdefinitiontemplateclassHashmap{private:intmappedElementCount;public:ex

c++ - std::string_view 编译时散列

似乎std::hashfunctions对于C++17string_view不是constexpr的。在我看来,绑定(bind)到constchar[]的字符串View可以在编译时进行哈希处理(这会非常好),或者有什么可以阻止这种情况吗? 最佳答案 从C++14开始(参见17.6.3.4哈希要求,表26),我们有:Thevaluereturnedshalldependonlyontheargumentkforthedurationoftheprogram.[Note:Thusallevaluationsoftheexpression

c++ - 无序关联容器什么时候发生重新散列?

我在标准中发现这是无序关联容器中rehash函数的后置条件:Post:a.bucket_count()>a.size()/a.max_load_factor()anda.bucket_count()>=n.(nbeingthenumberofbucketsinthecontainer)我是否可以将以上内容理解为当所有实现都满足上述任一条件时触发自动重新散列?或者,实现是否可以自由决定何时重新散列,而以上仅适用于rehash功能? 最佳答案 实现应保持load_factor()和load_factor()==size()/bucket

c++ - 在 C++ 中为 unordered_set 声明散列函数?

这个问题在这里已经有了答案:Isthereadefaulthashfunctionforanunordered_setofacustomclass?(2个答案)Insertingintoanunordered_setwithcustomhashfunction(2个答案)关闭5年前。我必须为一个相当大的项目使用unordered_set,为了确保我正确使用它,我尝试了一个小例子。#include#includeusingnamespacestd;classFoo{private:intx;public:Foo(intin){x=in;}booloperator==(constFoo&f

c++ - 散列任意精度值(boost::multiprecision::cpp_int)

我需要以任意精度获取一个值的散列值(来自Boost.Multiprecision);我用cpp_int后端。我想出了以下代码:boost::multiprecision::cpp_intx0=1;constautoseed=std::hash{}(x0.str());我不需要代码尽可能快,但我发现对字符串表示进行哈希处理非常笨拙。所以我的问题是双重的:保持任意精度,我可以更有效地散列值吗?也许我不应该坚持保持任意精度,我应该转换成一个我可以轻松散列的double(不过,我仍然会使用任意精度值进行哈希表所需的比较)? 最佳答案 您可以

c++ - 特定长度的字符串的散列

有没有办法生成一个字符串的散列,使散列本身具有特定的长度?我有一个生成41字节散列(SHA-1)的函数,但我需要它最大为33字节(由于某些硬件限制)。如果我将41字节的散列截断为33,我可能(当然!)会失去唯一性。或者实际上我认为MD5算法会很适合,如果我能在您的帮助下找到一些C代码的话。编辑:感谢大家的快速和知识渊博的回复。我选择使用MD5哈希,它非常适合我的目的。唯一性是一个重要的问题,但我不希望这些散列的数量在任何给定时间都非常大——这些散列代表家庭LAN上的软件服务器,因此最多会有5个,也许10个在运行。 最佳答案 IfIt

c++ - 如何散列 unordered_map?

boost::hash具有适用于大多数内置类型(包括容器)的哈希函数。但如boost::hash_rangefunctiondescription中所述,范围的哈希算法issensitivetotheorderoftheelementssoitwouldn'tbeappropriatetousethiswithanunorderedcontainer因此,std::unordered_map和boost::unordered_map都没有boost::hash特化。问题是:是否有一种“简单有效”的方法来散列unordered_map而无需从头开始重新实现散列算法?

c++ - 具有相同散列值的值是否在同一个 std::unordered_map 桶中?

如果std::unordered_map的两个键具有相同的哈希值,标准是否保证它们将进入同一个桶?根据模板相等谓词,我们假设键不相等,它们仅具有相同的哈希值。奖励问题:如果相同的散列并不意味着相同的桶,那么能够单独遍历桶的目的是什么? 最佳答案 具有相同哈希值的对象被无序关联容器放入同一个桶中。因此,两个相等的对象必须具有相同的哈希值。23.2.5第8段:Theelementsofanunorderedassociativecontainerareorganizedintobuckets.Keyswiththesamehashcod

c++ - 如何正确散列自定义结构?

在C++语言中有默认的散列函数模板std::hash对于最简单的类型,比如std::string,int等。我想,这些函数具有良好的熵,并且相应的随机变量分布在统计上是均匀的。如果不是,那么让我们假设它是。然后,我有一个结构:structCustomType{intfield1;shortfield2;stringfield3;//...};我想对它进行哈希处理,使用它的某些字段的单独哈希,比如std::hash(field1)和std::hash(field2).两个散列都在一组可能的值中,类型为size_t.什么是好的散列函数,它可以组合这些结果并将它们映射回size_t?

【C/C++笔试练习】单链表插入节点、单链表删除操作、链表性质、链式栈、链式队列、二叉树的叶子结点、二叉排序树的性质、堆的特征、哈希表散列法、堆排序、洗牌、MP3光标位置

文章目录C/C++笔试练习选择部分(1)单链表插入节点(2)单链表删除操作(3)链表性质(4)链式栈(5)链式队列(6)二叉树的叶子结点(7)二叉排序树的性质(8)堆的特征(9)哈希表散列法(10)堆排序编程题day21洗牌MP3光标位置C/C++笔试练习选择部分(1)单链表插入节点  设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度()  A.O(log2n)  B.O(1)  C.O(n2)  D.O(n)  答案:D  在有序单链表中插入一个新结点并保持有序,通常需要遍历链表找到合适的位置插入新结点。遍历链表的时间复杂度是O(n),因为最