依据hash的命令管理

2023-3-27 来源:不详 浏览次数:

最近做的项目很有意思,之前看的内核的设备管理的方法正好用在这个项目上,以此作为记录,若是以后再遇到可以提供一些思想。最为神奇的是,一写完就可以直接跑起来,没有错误,还真是第一次不是所谓的“写bug”,真真的写代码,有点小激动把理论用起来了。

怎么回事尼?就相当于写一个小系统,系统里面有很多命令,怎么管理这些命令,就相当于linux常用的命令是怎么管理的,uboot的命令是怎么管理的,两者的代码具体没看过,想必也是很经典的框架,我们在具体一点,比如现在,在终端输入了一个命令,代码里面获取到命令以后,怎么判断输入的命令是什么,简单的法子就是一个一个的比较,但是命令有或者个的话,再一个一个比较肯定是不行的,这个时候可以用到hash,其他方法我没试过,因为自己的数据结构的理论不怎么好,也没有具体的例子,导致不会cp,正好看过内核采用hash来管理设备,所以这次正好派上用场,好了,为什么选择hash就是这样的,当然还有其他更好的方法,抱歉,实在不会...

好了,先上图说明大致的框架,有个直观的印象:

先说说hash,hash分两大块,第一大块就是函数模型,这里我们选择最为简单的取余数的方法h(K)=Kmodm,第二大块就是避免hash冲突,我们同样选择简单的链表法;

先说这个h(K)怎么在代码中用起来,看上图的probes[],我们把上图假设为命令管理系统,probes[]理解为有个命令指针,也就是h(K)函数中的m=,每一个指针可以构成一个链表,链表怎么形成的稍后再说,现在假设输入一个K值那么就得到(0-)的某一个值,那么我们很显然的就会想到,若是把一个命令变成一个唯一的整形数字,然后该整型值mod的话,也就是只需要写出这句代码probes[Kmode],不就是这个命令的指针了吗?既然有了指针,假设后面的链表存的是把命令转化为整形数据,然后我们一个一个去比较链表每一个节点的数据是不是我们输入的命令转化为整形数,若是找到了,就可以具体的做一些事情了,这样肯定要比一个一个比较要来的快。

有点绕,我们这样说,一步一步的来,首先要把个字符串也就是命令转化为唯一的整形数值,假设转化为[0-]了,分别存在不同的变量中,然后把存这[0-]的变量取地址,然后用probes[]指针分别去指向这些地址,当要查找某一个命令的时候,我们要做的就是先把命令转化为整形,然后写出这句代码probes[Kmode](K就是字符串转化为整形的值),不就是我们要找的命令转化为整形的变量的地址了,然后再用if判断这个地址所指向的内容是不是我们输入的命令转化为整形的值,比如ls命令转为整形0且这个0是唯一的存在data这个变量里面,当我们要查找ls命令的时候,probes[0%]=probes[0]正好指向data的地址,然后取地址比较两者是不是0,是0做进一步的操作,不是就查找下一个链表。

废话有点多,但是思路就是这样,那么还有两个问题,一个是怎么把字符串转化为唯一的整形值,还有个是链表又是怎么回事;

先说链表是怎么回事,因为h(k)=kmod存在一个问题,也就是上面说的hash冲突,比如(0mod)和(mod)两个值都是0,那么说明一个问题当不同字符串转化为不同唯一的整形的时候比如一个是0一个是,那么都会索引到probes[0]这个指针,那岂不是有问题了,那么我们的解决办法就是,形成一个链表,怎么搞?这样,每一个命令转为整形都是唯一的,我们把probes[0]指向k=0的节点,然后在存k=的时候,我们按照从小到大的顺序存放节点:probes[0]-data0-data,查找的时候比如查找k=的时候先索引到probes[0],然后比较链表的每一个节点是否存在k=的整形数,有就可以做进一步的操作了,比如在链表里面的每一个节点,添加函数指针,当找到后,可以调用指针函数,做进一步的处理;

对于字符串怎么转化为整形,我是从网上找的代码,但是这个函数不太好:

longlongChar_2_Hash_Key(unsignedchar*

转载请注明:
http://www.wanruiguanye.com/bzhl/77435643.html
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 网站首页 版权信息 发布优势 合作伙伴 隐私保护 服务条款 网站地图 网站简介

    温馨提示:本站信息不能作为诊断和医疗依据
    版权所有 2014-2024
    今天是: