首页 > 编程语言 >用C++写的一个万用哈希函数模板

用C++写的一个万用哈希函数模板

时间:2023-10-05 15:32:10浏览次数:30  
标签:hash val void C++ seed 哈希 const size 万用

用C++写的一个万用哈希函数模板

template <typename T>
inline void hash_combine(size_t& seed, const T& val)
{
    seed ^= hash<T>()(val) +
        0x9e3779b9 +
        (seed << 6) +
        (seed << 2);
}

template <typename T, typename... Types>
inline void hash_val(size_t& seed, const T& val)
{
    hash_combine(seed, val);
}

template <typename T, typename... Types>
inline void hash_val(size_t& seed, const T& val, const Types&... args)
{
    hash_combine(seed, val);
    hash_val(seed, args);
}

template <typename... Types>
inline void hash_val(const Types&... args)
{
    size_t seed = 0;
    hash_val(seed, args);
    return seed;
}

应用举例

假设你有一个学生类Customer,其包含first name , last name以及学号,现在利用上面的万能哈希函数求得其哈希值,以决定该类实例放置于hashset中的位置。你就可以像下面这样调用它:

class CustomerHash{
public:
    std::size_t operator()(const Customer& c)const{
        return hash_val(c.fname, c.lname, c.no);
    }
}

标签:hash,val,void,C++,seed,哈希,const,size,万用
From: https://blog.51cto.com/u_14592069/7714389

相关文章

  • windows上的C++编译环境
    Windows上的C++编程环境比Linux上的繁杂很多,有许多工具已经很老了,但是很多教材也还在用,很多学校的教学也还在用。另一方面,有更现代的选择,但是需要一些必要的配置和对工具链组成的理解,本文将必要的环境都介绍一遍,让新手能有一个相对完整的理解,然后迅速抛弃老旧的工具链,使用更现代......
  • VC++编写ActiveX控件方法
    暑假在做一个项目的时候,本来是用C#.NET来写的一个港口进出闸的流程控制程序,里面涉及一个响应用PLC的采集信息的问题(PLC用串口和工控机相连接),然后思考如何用C#写串口通讯程序,结果师兄在一旁直接用VC++写了一个“*.ocx控件”,并在自己的电脑上进行了测试,完工后就把生成的“*.ocx”控......
  • C++中的inline用法
    1.引入inline关键字的原因在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程......
  • C++模板template应用总结
    引言模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IOStream。函数模板在c++入门中,很多人会接触swap(int&,int&)这样的函数类似代码如下:voidswap(int&a,int&b){......
  • 十四天学会C++之第三天(数组和字符串)
    1.数组的定义和初始化数组是一种由相同数据类型的元素组成的集合,这些元素按照一定的顺序存储在连续的内存位置上。数组的大小在创建时是固定的,无法在运行时改变。在C++中,数组的定义和声明非常简单。定义一个数组:数据类型数组名[数组大小];数据类型可以是整数、浮点数、字符等,数组......
  • C++ Thread 条件变量
    Condition_Variable介绍条件变量是利用线程间共享的全局变量进行同步的一种机制条件变量是为了控制多线程有顺序地访问共享资源,它和互斥量协同控制多线程有序,互斥地访问共享资源,重要解决的问题是生产者和消费者的问题variable_condition该类是专门结合unique_lock使用......
  • VC++ MFC 编程--CMap的使用
    本文翻译自: CMapHow-to-CodeProject介绍像我这样的程序员,在CMap之前学习了STL::map,总是认为CMap很难使用,并且总是尝试以STL::map的方式使用CMap。在本文中,我将解释CMap,以及如何将它用于您自己的自定义类。在本文的最后,我将展示一个如何正确使用CMap与CString*的例子(注意,我......
  • C/C++学习 -- 分组加密算法(DES算法)
    数据加密标准(DataEncryptionStandard,DES)是一种对称密钥加密算法,是信息安全领域的经典之作。本文将深入探讨DES算法的概述、特点、原理,以及提供C语言和C++语言实现DES算法的代码案例。一、DES算法概述DES算法是一种对称密钥加密算法,由IBM于1977年开发并于1977年被美国国家标准局(NI......
  • QFluentWidgets: 基于 C++ Qt 的 Fluent Design 组件库
    简介QFluentWidgets是一个基于Qt的FluentDesigner组件库,内置超过150个开箱即用的FluentDesigner组件,支持亮暗主题无缝切换和自定义主题色。搭配所见即所得的FluentDesigner软件,只需拖拖拽拽,不用编写一行QSS,就能快速搭建现代化软件界面。官网地址:https://qfluentw......
  • C++ bitset 用法和应用
    C++的bitset在bitset头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。下面是具体用法构造函数bitset常用构造函数有四种,如下bitset<4>bitset1;//无参构造,长度为4,默认每一位为0bitset<8>bitset2(12);//长度为8,二进制保存,前......