做了几年开发,一直不理解HASH算法的原理。今天偶从百度知道上看到一个牛人神一样的理解:

这个问题有点难度。不是非常好说清楚。 我来做一个比喻吧。

我们有非常多的小猪,每一个的体重都不一样,假设体重分布比較平均(我们考虑到公斤级别),我们依照体重来分,划分成100个小猪圈。
然后把每一个小猪,依照体重赶进各自的猪圈里。记录档案。 好了。假设我们要找某个小猪怎么办呢?我们须要每一个猪圈。每一个小猪的比对吗?
当然不须要了。 我们先看看要找的这个小猪的体重,然后就找到了相应的猪圈了。
在这个猪圈里的小猪的数量就相对非常少了。
我们在这个猪圈里就能够相对快的找到我们要找到的那个小猪了。 相应于hash算法。
就是依照hashcode分配不同的猪圈。将hashcode同样的猪放到一个猪圈里。
查找的时候。先找到hashcode相应的猪圈。然后在逐个比較里面的小猪。 所以问题的关键就是建造多少个猪圈比較合适。 假设每一个小猪的体重所有不同(考虑到毫克级别),每一个都建一个猪圈,那么我们能够最高速度的找到这头猪。 缺点就是。建造那么多猪圈的费用有点太高了。 假设我们依照10公斤级别进行划分。那么建造的猪圈仅仅有几个吧,那么每一个圈里的小猪就非常多了。我们尽管能够非常快的找到猪圈。但从这个猪圈里逐个确定那头小猪也是非常累的。 所以,好的hashcode。能够依据实际情况,依据详细的需求。在时间成本(很多其它的猪圈。更快的速度)和空间本(更少的猪圈。更低的空间需求)之间平衡。

样例非常贴切、也非常浅显易懂,但不够全面。

Hash。一般翻译做“散列”,也有直接音译为“哈希”的,就是把随意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这样的转换是一种压缩映射。也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成同样的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将随意长度的消息压缩到某一固定长度的消息摘要的函数。

HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值.也能够说,hash就是找到一种数据内容和数据存放地址之间的映射关系

比如字符串 hello的哈希算法

char* value = "hello"; int key = (((((((27*(int)'h'+27)* (int)'e') + 27) * (int)'l') + 27) *(int)'l' +27) * 27 ) + (int)'o' ;。

下边再来说一下HASH表(哈希表),哈希表作为一种数据结构。有着查询快、操作easy等特性,这点能够差别于数组和链表,数组的特点是:寻址easy。插入和删除困难。而链表的特点是:寻址困难,插入和删除easy。哈希表弥补了二者的不足,哈希表有多种不同的实现方法,为了让大家更easy理解,这里具体介绍下一种比較经常使用的方法:拉链法。我们能够理解为用一个线性数组来做寻址。数组中的元素为一个链表结构。用作元素集合(插入、删除等),这样便能够做到了寻址、插入、删除的高速操作,以下用一张图表示下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1MjUxODkwMzQ3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

文章仅仅是做一个简单的介绍。让大家更easy理解什么是哈希算法,算是抛砖引玉吧。假设有不正确的地方,欢迎大家指正。

HASH算法具体解释的更多相关文章

  1. hash算法

    作者:July.wuliming.pkuoliver 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash ...

  2. Hash算法初见

    hash算法 (hashmap 实现原理)   Hash ,一般翻译做“ 散列” ,也有直接音译为“ 哈希” 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定 ...

  3. 【数据结构与算法】一致性Hash算法及Java实践

    追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...

  4. hash算法与hashmap

    参考博客: http://zha-zi.iteye.com/blog/1124484 http://www.cnblogs.com/dolphin0520/p/3681042.html(参考了hash ...

  5. [区块链] 密码学中Hash算法(基础)

    在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理——基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...

  6. 【区块链】【一】Hash 算法【转】

    问题导读1.哈希算法在区块链的作用是什么?2.什么是哈希算法?3.哈希算法是否可逆?4.比特币采用的是什么哈希算法? 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块链通过 ...

  7. Hash算法的讲解

    散列表,又叫哈希表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash ta ...

  8. Hash算法总结(转)

    1. Hash是什么,它的作用先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人 ...

  9. HashMap中的hash算法总结

    前言 算法一直是我的弱项,然而面试中基本是必考的项目,刚好上次看到一个HashMap的面试题,今天也来学习下 HashMap中的hash算法是如何实现的. 数学知识回顾 << : 左移运算 ...

随机推荐

  1. POJ——T 1961 Period

    http://poj.org/problem?id=1961 Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 18542   ...

  2. 在OSG 实现的 oculus rift 效果

    在OSG 实现的oculus rift 效果,还不错 这个是Delta3d中实现的 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1eWluZ3Fpb ...

  3. worktools-源码下拉问题

    今天下拉源码的时候,出现了一个问题,就是当地的内容跟仓库的内容冲突,导致merge冲突.这时候CC指令不能用.然后希望通过checkout到其他分支,然后cc掉的.结果没办法切换到其他分支,一直停留在 ...

  4. POJ 2427 Smith's Problem Pell方程

    题目链接 :  http://poj.org/problem?id=2427 PELL方程几个学习的网址: http://mathworld.wolfram.com/PellEquation.html ...

  5. 笔记四:onsubmit和onclick的区别

    今天碰到关于表单提交的问题,我是用submit还是用onclick好呢,然后我去百度了一下两者的区别: onsubmit只能表单上使用,提交表单前会触发, onclick是按钮等控件使用, 用来触发点 ...

  6. 【Oracle错误集锦】:PLSQL无法直连64位Oracle11g数据库

    背景:Oracle数据库装在本机上,使用PLSQL连接. 今天安装完Oracle 11g数据库后.用plsql连接数据库死活都连接不上.而且plsql客户端登录窗体的Database下拉框还为空.见下 ...

  7. HDU1203 I NEED A OFFER! 【贪心】

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. POJ 3592--Instantaneous Transference【SCC缩点新建图 &amp;&amp; SPFA求最长路 &amp;&amp; 经典】

    Instantaneous Transference Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6177   Accep ...

  9. hard-negative mining 及伪代码实现

    Histogram of Oriented Gradients and Object Detection 获得 records 对于目标检测(object detection)问题,所谓的 hard- ...

  10. 79.cgi硬盘查询个人信息

    运行截图: 把cgi编码转为char*类型 //把cgi编码转为char*类型 char* change(char *str) { //分配内存 ); //x是tempstr的下标,y是str的下标 ...