首页 > 其他分享 >哈希函数详解

哈希函数详解

时间:2022-12-29 12:00:56浏览次数:41  
标签:15 函数 17 16 18 详解 哈希 14

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。


这是来自wiki的解释,为了透彻理解这个问题,我们举个简单的例子…


比如项羽要分封十八路诸侯,这十八路诸侯倒秦功劳、实力以及对项羽的忠诚度不一而足,如何分封、管制就是一个大问题。每个诸侯包括拥有兵力,封王地域等诸多信息,把这些信息全放进一个结构体,我们只要知道这个结构体地址,即可知道该王所有信息。我们声明一个有序数组king_value[n],把每个封王(结构体指针)放在king_value []中占一项,那么项王只要拥有king_value [n]这个数组,就可以快速调用天下诸侯的所有信息。


问题就出现了,假如你要查找某个诸侯的资料,必须把这个数组遍历一遍,时间复杂度是O(n),明显的n越大,找到某个封王的时间就越长,是相当低效的。


为了加速查找,我们想到一个办法,把某封王通过一个关系转换,得到一个整数(即关键码值),把该王信息保存在,以这个整数为下标的king_value[n]数组中,那么以后要查找任一个封王信息,只要把该王通过指定关系转换计算一下,就得到一个数组下标,很容易就得该王储存项,时间是固定的长度O(1)。这个转换关系就是哈希函数,这个数组就是哈希表。


那么现在的问题是,如何实现这个转换关系,我们看看Linux内核的哈希函数

点击(此处)折叠或打开


unsigned long hash_long(unsigned long val,unsigned int bits)
{
unsigned long hash = val * 0x9e370001UL;
return hash >> (32 - bits);
}

还有一个冲突问题,比如给英布用哈希函数得到整数10,就把king_value[10]就分给他了,那接着给刘季的哈希函数也得到10,怎么办呢,处理方法有开放地址法、再散列法、拉链法等。这里简单的放在11,若11已经有人占了,就给12,依次类推。


那么内核这个哈希函数是否可以达到关键字均衡存放呢,写个简单的程序来测试下内核这个哈希函数是否靠谱,

点击(此处)折叠或打开


#include <stdio.h>
#include <stdlib.h>

unsigned long hash_long(unsigned long val,unsigned int bits)
{

unsigned long hash = val*0x9e370001UL;

return hash >> (32-bits);
}

int main(int argc, char *argv[])
{
int i, j = atoi(argv[1]);

for (i = 0; i <= 32767; i++) {
if (hash_long(i, 11) == j)

printf("pid-->%d\n", hash_long(i,11));
}
return 0;
}
主要功能是把0~32767的pid值转换为hash的索引

leon@PC:~/work$ ./a.out 10 |wc -l
17

leon @PC:~/work$ ./a.out 20 |wc -l
17

leon @PC:~/work$ ./a.out 23 |wc -l
15

leon @PC:~/work$ ./a.out 231 |wc -l
17

看看下标分配到0~2047出现的分布

点击(此处)折叠或打开

#!/bin/bash

declare -i i

i=0

for((i=0;i<2047;i++))

do

./a.out $i | wc -l |tr '\n' ' '

done
leon@PC:~/work$ ./pid.sh


18 17 17 17 16 15 15 15 15 17 17 17 17 15 15 15 15 16 17 17 17 17 15 15 15 14 17 17 17 17 17 15 15 15 15 17 17 17 17 16 15 15 14 15 17 17 17 17 16 15 15 15 16 17 17 17 17 16 15 14 15 16 17 17 17 17 15 15 15 15 17 17 17 17 17 15 14 15 15 17 17 17 17 16 15 15 15 15 17 17 17 17 16 14 15 15 16 17 17 17 17 16 15 15 15 16 17 17 17 17 14 15 15 15 16 17 17 17 17 15 15 15 15 17 17 17 17 15 15 15 15 15 17 17 17 18 15 15 15 15 16 17 17 17 17 15 15 15 15 16 17 17 18 16 15 15 15 15 16 17 17 17 16 15 15 15 15 17 17 18 17 16 15 15 15 15 17 17 17 17 15 15 15 15 16 17 18 17 17 15 15 15 15 16 17 17 17 16 15 15 15 15 16 18 17 17 16 15 15 15 15 17 17 17 17 16 15 15 15 15 18 17 17 17 15 15 15 15 15 17 17 17 17 15 15 15 15 17 17 17 17 16 15 15 15 14 17 17 17 17 16 15 15 15 16 17 17 17 17 16 15 15 14 16 17 17 17 17 15 15 15 15 16 17 17 17 17 15 15 14 15 17 17 17 17 17 15 15 15 15 17 17 17 17 16 15 14 15 15 17 17 17 17 16 15 15 15 16 17 17 17 17 15 14 15 15 16 17 17 17 17 15 15 15 15 17 17 17 17 17 14 15 15 15 17 17 17 17 16 15 15 15 15 17 17 17 17 15 15 15 15 16 17 17 17 18 15 15 15 15 16 17 17 17 16 15 15 15 15 17 17 17 18 16 15 15 15 15 17 17 17 17 15 15 15 15 15 17 17 18 17 15 15 15 15 16 17 17 17 17 15 15 15 15 16 17 18 17 16 15 15 15 15 16 17 17 17 16 15 15 15 15 17 18 17 17 15 15 15 15 15 17 17 17 17 15 15 15 15 16 18 17 17 17 15 15 15 15 16 17 17 17 16 15 15 15 15 17 17 17 17 16 15 15 15 15 17 17 17 17 16 15 15 15 16 17 17 17 17 15 15 15 14 17 17 17 17 17 15 15 15 15 17 17 17 17 16 15 15 14 15 17 17 17 17 16 15 15 15 16 17 17 17 17 16 15 14 15 16 17 17 17 17 15 15 15 15 16 17 17 17 17 15 14 15 15 17 17 17 17 17 15 15 15 15 17 17 17 17 16 14 15 15 16 17 17 17 17 16 15 15 15 16 17 17 17 17 14 15 15 15 16 17 17 17 17 15 15 15 15 17 17 17 17 16 15 15 15 15 17 17 17 18 15 15 15 15


基本是均匀分布的,并且哈希函数及其简洁,实现了快速访问,典型的以空间换时间例子,堪称完美(原理还没弄明白),要是项王看过Linux内核,懂得这水平的哈希函数,或许就不会有乌江惨剧了喔。


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>


标签:15,函数,17,16,18,详解,哈希,14
From: https://blog.51cto.com/u_7784550/5976668

相关文章

  • VueJS使用addEventListener的事件如何触发执行函数的this
    1、使用浏览器监听切屏为例此处为考虑浏览器兼容性推荐使用:document.addEventListener1.1、正常函数使用如下:letn=0;letmax=3;//切屏最大次数document.addE......
  • 一文详解为什么需要用CMake来管理大型C++工程
    场景1:编译普通C++代码/*hello_world.cpp*/#include<iostream>usingnamespacestd;intmain(){cout<<"Hello,world!"<<endl;return0;}编译......
  • 重磅直播|中科慧眼崔峰博士详解深度相机原理及其应用
    大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微信群内完成答疑。主讲人对该领域的核心和主流技术进行了详解,干货满满,线下......
  • JavaScript防抖与节流函数:提高应用性能的利器
    前言大家好,我是CoderBin,防抖和节流函数目前已经是前端实际开发中两个非常重要的函数,也是面试经常被问到的面试题。但是很多前端开发者面对这两个函数还是有点摸不着头脑:无......
  • Elasticsearch详解--下
    映射详解Mapping映射是什么映射定义索引中有什么字段、字段的类型等结构信息。相当于数据库中表结构定义,或solr中的schema。因为lucene索引文档时需要知道该如何来索......
  • Python图像处理丨详解图像去雾处理方法
    摘要:本文主要讲解ACE去雾算法、暗通道先验去雾算法以及雾化生成算法。本文分享自华为云社区《[Python图像处理]三十.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算......
  • 原码, 反码, 补码 详解
    一.机器数和真值在学习原码,反码和补码之前,需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是......
  • SQL Server 2019 内置函数
    SQLServer2019内置函数SQLServer为了日常方便加入了一些内置函数,可以供使用者直接使用,避免用户再去编写函数。如何学习过C语言可能知道,我们经常使用字符串处理函数,如......
  • Prometheus技术分享——prometheus的函数与计算公式详解
    Prometheus与zabbix相比,它的强大之处就在于可以它可以使用的很多计算公式去获取自己需要的数据。当然,这里所涉及到的计算公式,也是我们普遍认为的难点所在。比如,我们要获取CP......
  • Prometheus技术分享——prometheus的函数与计算公式详解
    Prometheus与zabbix相比,它的强大之处就在于可以它可以使用的很多计算公式去获取自己需要的数据。当然,这里所涉及到的计算公式,也是我们普遍认为的难点所在。比如,我们要获取C......