1.基本概念

  哈希一般用来快速查找,通过hash函数将输入的键值(key)映射到某一个地址,然后就可以获得该地址的内容。

同样,如果要储存一对值(键值和数据),则也是通过hash函数获得地址来存入。见图例:

  不过这其中会出现一些问题,最常见的是出现冲突。就是输入不同的key,经过hash之后得到同样的值,也就是在同一个地址要储存不同的data,

例如使用上图的hash,输入的key为1和11得到的地址都是1,则这种就是出现了冲突。

  解决这种冲突的方法有多种,比如线性探测法,折叠法,链表法等等。

2.实例

  下面是一个基于C++的简单的模板类,使用链表法来解决冲突。该hash类的数据结构为:

struct data
{
size_t key;
map_t content;
bool isEmpty;
data * next;
data() :isEmpty(true), next(nullptr){}
};

  程序:

template<typename map_t>
class MyHash
{
public:
MyHash() :size()
{
store = new data[size];
}
MyHash(size_t s) :size(s)
{
store = new data[size];
}
~MyHash()
{
delete[]store;
}
public:
bool insert(size_t key, map_t val);
bool find(size_t key, map_t & val);
bool erase(size_t key);
void print(); private:
size_t size;
struct data
{
size_t key;
map_t content;
bool isEmpty;
data * next;
data() :isEmpty(true), next(nullptr){}
}; data * store;
size_t hash(size_t key);
}; template<typename map_t>
bool MyHash<map_t>::insert(size_t key, map_t val)
{
size_t t_k = hash(key);
if (t_k >= size || t_k < )
return false;
if (!store[t_k].isEmpty)
{
data * temp_ptr = & store[t_k];
while (temp_ptr->next!=nullptr)
{
temp_ptr = temp_ptr->next;
if (temp_ptr->key == key)
{
temp_ptr->content = val;
return true;
}
}
data *new_ = new data; new_->key = key;
new_->content = val;
new_->isEmpty = false;
new_->next = nullptr;
temp_ptr->next = new_; return true;
} data* new_ = new data;
new_->key = key;
new_->content = val;
new_->isEmpty = false;
new_->next = nullptr; store[t_k].next = new_;
store[t_k].isEmpty = false; return true;
}
template<typename map_t>
bool MyHash<map_t>::find(size_t key, map_t& val)
{
size_t t_k = hash(key);
if (t_k >= size || t_k < )
return false; data * temp_ptr = &store[t_k];
while (temp_ptr->next != nullptr)
{
temp_ptr = temp_ptr->next;
if (temp_ptr->key == key)
{
val = temp_ptr->content;
return true;
}
}
return false;
}
template<typename map_t>
bool MyHash<map_t>::erase(size_t key)
{
size_t t_k = hash(key);
if (t_k >= size || t_k < || store[t_k].isEmpty)
return false; data * temp_ptr = &store[t_k];
data * temp_ptr_ = &store[t_k];
while (temp_ptr->next!=nullptr)
{
temp_ptr_ = temp_ptr;
temp_ptr = temp_ptr->next;
if (temp_ptr->key == key)
{
temp_ptr_->next = temp_ptr->next;
delete temp_ptr;
return true;
}
} return false;
}
template<typename map_t>
void MyHash<map_t>::print()
{
for (int i = ; i < size; ++i)
{
if (!store[i].isEmpty)
{
cout << i << " : "; data * temp_ptr = &store[i];
while (temp_ptr->next != nullptr)
{
temp_ptr = temp_ptr->next;
cout << " - " << temp_ptr->content;
}
cout << endl;
}
}
} template<typename map_t>
size_t MyHash<map_t>::hash(size_t key)
{
return key%size;
}

C++:哈希的更多相关文章

  1. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  2. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  3. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  4. 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

    据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...

  5. Oracle 哈希连接原理

    <基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...

  6. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

  7. BZOJ 3555: [Ctsc2014]企鹅QQ [字符串哈希]【学习笔记】

    3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2046  Solved: 749[Submit][Statu ...

  8. [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)

    Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...

  9. minHash最小哈希原理

    minHash最小哈希原理 收藏 初雪之音 发表于 9个月前 阅读 208 收藏 9 点赞 1 评论 0 摘要: 在数据挖掘中,一个最基本的问题就是比较两个集合的相似度.通常通过遍历这两个集合中的所有 ...

  10. .net的一致性哈希实现

    最近在项目的微服务架构推进过程中,一个新的服务需要动态伸缩的弹性部署,所有容器化示例组成一个大的工作集群,以分布式处理的方式来完成一项工作,在集群中所有节点的任务分配过程中,由于集群工作节点需要动态增 ...

随机推荐

  1. 『NiFi 学习之路』简介

    『NiFi 学习之路』简介 『NiFi 学习之路』入门 -- 下载.安装与简单使用 『NiFi 学习之路』资源 -- 资料汇总 『NiFi 学习之路』把握 -- 架构及主要组件 『NiFi 学习之路』 ...

  2. atheros无线驱动之:数据接收流程

    1:数据处理函数tasklet,workqueue在之前的初始化代码中的函数__ath_attach()中,有如下的代码: #ifndef ATH_SUPPORT_HTC#ifdef ADF_SUPP ...

  3. 性能调优之MySQL篇四:MySQL配置定位以及优化

    一.CPU最大性能模式 cpu利用特点 5.1 最高可用4个核 5.5 最高可用24核 5.6 最高可用64核心 一次query对应一个逻辑CPU 你仔细检查的话,有些服务器上会有的一个有趣的现象:你 ...

  4. (译)Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机

    Windows Azure的7月更新:SQL数据库,流量管理,自动缩放,虚拟机 今早我们释出一些很棒的Windows Azure更新.这些新的提升包括:SQL数据库:支持SQL自动导出和一个新的高级层 ...

  5. (转载)sql注入实战 mysql篇

    出现的关键名词有: UNION  SELECT   load_file   hex 为了方便说明我们先创建两个表:hehe和heihei,很明显它们一个拥有2列属性,一个拥有3列属性 ======== ...

  6. Zookeeper环境安装

    源码包下载: http://archive.apache.org/dist/zookeeper/zookeeper-3.4.10 集群环境: master 192.168.1.99 slave1 19 ...

  7. Ubuntu 16.04 安装Navicat Premium

    一.介绍 Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库 ...

  8. 照着官网来安装openstack pike之创建并启动instance

    有了之前组件(keystone.glance.nova.neutron)的安装后,那么就可以在命令行创建并启动instance了 照着官网来安装openstack pike之environment设置 ...

  9. Ubuntu12.04 安装adb

    1.通过apt-get安装adb sudo add-apt-repository ppa:nilarimogard/webupd8 sudo apt-get update sudo apt-get i ...

  10. 谈谈let与const

    let 命令 let命令用于声明变量,但是与传统var命令的不同之处在于拥有以下特性: 使用let命令声明的变量只在let命令所在的代码块内有效(我将之称为变量绑定): 不存在变量提升: 存在暂时性死 ...