hash 函数

hash 函数

#ifndef __SGI_STL_HASH_FUN_H
#define __SGI_STL_HASH_FUN_H

#include <stddef.h>

__STL_BEGIN_NAMESPACE

//@ hash function 是计算元素位置的函数
//@ 这些函数可以对hashtable进行取模运算
//@ 这是hashtable所提供的散列函数是取模运算决定的

/*
SGI hashtable以下有限的定义类型:
	struct hash<char*>
	struct hash<const char*>
	struct hash<char>
	struct hash<unsigned char>
	struct hash<signed char>
	struct hash<short>
	struct hash<unsigned short>
	struct hash<int>
	struct hash<unsigned int>
	struct hash<long>
	struct hash<unsigned long>
不在这里定义的类型,不能使用,若用户想要使用,则必须自己定义。例如:string,double,float
*/

template <class _Key> struct hash { };

//@ 对const char* 提供字符串转换函数
inline size_t __stl_hash_string(const char* __s)
{
  unsigned long __h = 0;
  for ( ; *__s; ++__s)
    __h = 5*__h + *__s;

  return size_t(__h);
}

__STL_TEMPLATE_NULL struct hash<char*>
{
  size_t operator()(const char* __s) const { return __stl_hash_string(__s); }
};

__STL_TEMPLATE_NULL struct hash<const char*>
{
  size_t operator()(const char* __s) const { return __stl_hash_string(__s); }
};

//@ 下面的hash函数都是直接返回原值
//@ 对于char,unsigned char,signed char,int,unsigned int,
//@ short, unsigned short, long,unsigned long都只是返回数值本身
__STL_TEMPLATE_NULL struct hash<char> {
  size_t operator()(char __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<unsigned char> {
  size_t operator()(unsigned char __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<signed char> {
  size_t operator()(unsigned char __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<short> {
  size_t operator()(short __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<unsigned short> {
  size_t operator()(unsigned short __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<int> {
  size_t operator()(int __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<unsigned int> {
  size_t operator()(unsigned int __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<long> {
  size_t operator()(long __x) const { return __x; }
};
__STL_TEMPLATE_NULL struct hash<unsigned long> {
  size_t operator()(unsigned long __x) const { return __x; }
};

__STL_END_NAMESPACE

#endif /* __SGI_STL_HASH_FUN_H */

总结

  • 在SGI STL中 hash 表的实现是采用拉链法,其中用到了哈希函数,哈希函数的作用是把元素键值映射到对应的桶子里面,一般哈希值是键值对桶子数取余。
  • 在 SGI STL提供的哈希函数是有限的,只支持特定的元素类型,若用户需要使用其他类型的哈希函数,则必须自行定义。定义的时候注意一下几点:
    • 使用 struct,然后重载 operator()。
    • 返回值是 size_t。
    • 参数是你要 hash 的 key 的类型。
    • 函数是const类型的。

例如定义 string 类型的哈希函数:

struct str_hash{
        size_t operator()(const string& str) const
        {
                unsigned long __h = 0;
                for (size_t i = 0 ; i < str.size() ; i ++)
                __h = 5*__h + str[i];
                return size_t(__h);
        }
};

原文地址:https://www.cnblogs.com/xiaojianliu/p/12609103.html

时间: 2024-11-02 11:51:43

hash 函数的相关文章

Bloom filter的实现以及常用的hash函数

bloom filter利用时间换空间的思想,利用多个哈希函数,将一个元素的存在状态映射到多个bit中,特别是在网络环境中,BF具有广泛的用途,关键问题就是要减少false positive rate(可以设置参数来调节),扩展有 counting BF.这里选用的hash函数是表现较好的 BKDRHash , SDBMHash, DJBHash . Bloom-filter代码: bloom_filter.h #ifndef __BLOOM_FILTER_H__ #define __BLOOM

Hash函数的安全性

我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题. 三个概念: 1.如果y<>x,且h(x)=h(y),则称为碰撞. 2.对于给定的x,要找到一个y满足y<>x,h(x)=h(y),在计算上不可行,称为弱无碰撞. 3.要找到任意一对数,x,y,y<>x,满足h(x)=h(y),在计算上不可行,则称为强无碰撞.(包含弱无碰撞) 假定:一个取整数的随机变量,服从1到n的随机分布,一个含有k个这种变量的集合,至少有一对

Hash表的hash函数,冲突解决方法有哪些

最常用的3个HASH函数: 1. 除法散列法:通过取k除以m的余数,来将关键字k映射到m个槽的某一个中去,即散列函数为: h(k) = k mod m 2. 乘法散列法:首先,用关键字k乘上常数A(0<A<1),并抽取kA的小数部分:然后,用m乘以这个值,再取结果的底(即整数部分).散列函数可表达为: h(k) = ⌊m(kA mod 1)⌋ 3.全域散列法(universal hashing) 解决冲突常用的两种方法: 1. 链接法(chaining):把散列到同一槽中的所有元素都存放在一个

常用hash函数对比分析(一)

主要目标:寻找一个hash函数,高效的支持64位整数运算,使得在速度.空间等效率相对其它函数函数较高,以及内部运算时32位整数运算. 测试了"RSHash","JSHash","PJWHash","ELFHash","BKDRHash","SDBMHash","DJBHash","DEKHash","BPHash","

&lt;Openssl下hash函数&gt;

hash函数:是不可逆的函数,它的输入可以是任意长度的字节流.它的输出是固定大小的,hash函数的作用就是给你的文件产生一个摘要,它是独一无二的. 例如:y=f(x) x代表输入  y代表输出   输入x求y容易  单输入y求x就难了 我们常见的hash函数MD5和SHA1 当然和有其他的比较少见. DM5 :通常为128个bits 16个字节 sha1:通常为160bits     一个字节8个bits 20个字节 [[email protected] ~]# md5sum /etc/pass

Bitset&lt;&gt;用于unordered container时的默认hash函数

自从c++11起,bitset用于unordered container,将会提供默认的hash函数. 在gcc中,相关代码如下: 01495 // DR 1182. 01496 /// std::hash specialization for bitset. 01497 template<size_t _Nb> 01498 struct hash<_GLIBCXX_STD_D::bitset<_Nb>> 01499 : public std::unary_functi

深入理解 hash 函数、HashMap、LinkedHashMap、TreeMap 【上】

前言 Map 是非常常用的一种数据接口.在 Java 中,提供了成熟的 Map 实现. 图 1 最主要的实现类有 Hashtable.HashMap.LinkedHashMap和 TreeMap.在 HashTable 的子类中,还有 Properties的实现.Properties 是专门读取配置文件的类,我们会在稍后介绍.这里首先值得关注的是 HashMap 和 HashTable 两套不同的实现,两者都实现了 Map 接口.从表面上看,并没有多大差别,但是在内部实现上却有些微小的细节. 首

字符串编码---hash函数的应用

之前就听说过有个叫做hash表的东西,这段时间在上信息论与编码,也接触了一些关于编码的概念,直到今天做百度之星的初赛的d题时,才第一次开始学并用hash 一开始我用的是mutimap和mutiset,先对字符串从小到大排序,再存进mutimap中,之后遍历mutimap的键,结果都超时了,代码如下: #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #includ

密码学hash函数-SHA256-512

[latexpage] Hash函数又称哈希函数.散列函数.杂凑函数.它是一种单向密码体制,即从一个从明文到密文的不可逆映射,只有加密过程,没有解密过程. Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h=H(M). 在安全应用中使用的Hash函数称为密码学Hash函数.(单向性).(抗碰撞性) 弱抗碰撞性:给定一个消息M,要找到另一个消息M',使得H(M)=H(M')很难. 强抗碰撞性:要找到两个随机明文M和M',使得H(M)=H(M')很难. Hash函数特点: 1.

使用Hash函数和MAC产生伪随机数

基于Hash函数的PRNG 流程非常类似于对称密码的CTR工作模式 算法的伪码如下 m = ⌈n/outlen⌉ data = V W = the null String for i = 1 to m wi = H(data) W = W || wi data = (data + 1) mod 2seedlen return leftmost n bits of W 说明: V是种子,seedlen为V的长度,n是需要的输出位数,H是Hash函数 对于诸如SHA-2等强密码学Hash算法,目前还