`
陌上烟雨
  • 浏览: 4227 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类
最新评论

MyHash总结

阅读更多
    前段时间因为自己的事情比较多,技术这块有些懈怠了,很多东西学得不扎实,常常产生眼高手低的情况。讲到Hash部分的时候,自认为听过课之后比较容易理解Hash的原理,于是放松了代码的练习,先进行一下自我检讨。
  Hash这部分原理其实不难理解,它也是数据结构的一种。数据结构最基础的有四种,分别是树、队列、Map、图,延伸之后产生数组、链表等对基础数据结构的应用。而Hash即是基础的数据结构组合而成的较为复杂的数据结构。
  Hash主要用到的数据结构是数组和链表,数组部分主要通过下标来查找,是连续的,而链表是指向性的,可以指向下一个结点,是非连续的。我对链表的掌握还是比较生疏,导致之后的应用出现一些问题。
  Hash结构是怎么来的呢?就像门上的珠帘一样,Hash是一个挂链式的结构,最上层是数组的分布,向Hash中添加元素的时候,总是会产生冲突的。我用到的将元素添加到数组方法还是value%size,即根据元素值除以数组大小的余数来将元素添加到与该余数相同下标的数组元素里。而这样就不可避免地会产生冲突,一个数组只能放一个数值,怎么办呢?这时我们就将余数相同的元素像链子一样一个一个地挂在数组元素的下方,这样一串一串地挂下来形成一个珠帘状的结构。
  实际写代码的时候,Hash函数里有四个基础的方法,也即函数要实现的效果:增加、删除、查找、修改。为了实现这四个目的,延伸出一些方法和属性,首先来说一下用到的属性:
  Size——Hash结构中处在珠帘顶端的数组容量
  Length——已存入的元素个数
  Local_factory——阀值,这里的阀值是一个临界点,当元素个数与数组容量的比值大于我们设置的阀值时,Hash结构就会进行重新散列。
  在主要的MyHash类中用到以下方法:
  1 构造方法,创建一个MyHash结构,主要是设置MyHash中数组的初始大小。
  2 增加:需要计算出该元素应放入的数组中的下标位置,即value%size,判断数组中该位置是否已经放入元素,如果该位置为空,就直接将要添加的元素放进去;如果该位置已有元素,就进行判断,该位置已存在的元素之后是否有元素,直到判断到nextElement为空的元素的时候,把要添加的元素挂在这个元素的后面,也就是像排队一样依次排下去。最后要进行阀值的判断,就是说将已存入的元素个数与Hash结构的数组容量进行比较,如果大于阀值则调用重散列方法。
  3 重散列:在该Hash结构中放入的数据越来越多,就会使得之后的查找、删除越来越麻烦,效率越来越低,因此我们需要把数组的size扩大,将Hash结构进行重新散列,也就是说把这些数据放入一个全新的Hash结构中,而这个新的Hash结构的数组容量将比旧Hash结构的数组容量要大,这样就可以使得查找、删除效率得到提高。当重散列方法被调用的时候,建立一个新数组,容量是原数组容量的两倍,然后找出原Hash结构中的各个元素并将它们添加到新的Hash结构中。
  4 删除:在Hash结构中进行循环查找,找到需要删除的元素,将该元素之后的元素挂链上方移动一位,把该元素删除。如果该元素之后未挂其他元素,直接把该元素的位置设置为空。
  5 查找:在Hash结构中进行循环,首先查找数组中每一个下标的位置里所储存的元素,如果该下标位置有元素,就在该元素后面继续进行查找,查找该下标的挂链。如果该位置未储存元素,则查找下一位置。直到将所有的元素都查找完毕。
  6 修改:在Hash结构中进行循环查找,找到需要修改的元素,并把该元素的值修改成需要修改的数据。
  另外,我自己写了Element类,是数组中储存的结点元素的类,该类中主要用到了设置本结点、返回本结点、设置下一结点、返回下一结点、设置结点中数据、返回结点中数据六种方法。
  MyHash中难点不在于理解,而在于动手操作。在实际写代码的时候我遇到一些问题,比如说数组越界、空指针等情况,都是思路中没有预料到的,而在删除结点时,也遇到了学习链表结构时候的老问题,即删除时思路被阻塞,总是无法删除到元素本身,而是在查找时用的临时元素,即将Hash结构中的元素赋值到临时元素上以便于循环的元素上进行操作。
  学习是一个不能眼高手低的过程,“想”与“做”是有很大不同的,只有真正“做”过了,才是真正的学到了,而眼高手低会导致一知半解,知其然而不知其所以然。所以在以后的学习中还是应该把重心有所转移,尽量在代码上多下功夫,不能掉以轻心!
  (我电脑不管怎么发都发不上去代码……总是在缓冲中……望见谅。。。)
分享到:
评论

相关推荐

    MyHash64_1.4.7.exe

    MyHash64_1.4.7.exe是一个计算文件SHA1、MD5值的工具,可以对比两个文件的完整性

    MyHash-master.zip

    查看对比md5,sha1等

    MyHash_1.4_校验工具

    一款采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。这款小巧实用的工具,原生单执行文件,采用UPX压缩后体积才几百KB,支持MD5、SHA1、CRC32、SHA256、SHA512等算法;支持哈希值比较、支持多个文件...

    MyHash 1.4.7.0

    一款采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。单文件,整合32位和64位可执行程序。作者drag0n发布的最终版,验证文件的首选。 功能特点: 1、只支持常用的CRC32、MD5、SHA1、SHA256、SHA512...

    文件校验工具 MyHash v1.4.6.7z

    MyHash是一款由drag0n编写的校验工具,采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。这款小巧实用的工具,原生单执行文件,采用UPX压缩后体积才几百KB,支持MD5、SHA1、CRC32、SHA256、SHA512等...

    HashFiles(计算文件各种校验参数)1.10绿色版

    HashFiles是一款免费的实用程序,用来计算CRC32,MD5文件或多个文件的​​SHA256和SHA1哈希有用。你不会觉得很难使用的应用程序,它的用户界面是不言自明,需要的用户快来下载吧。 虽然有一个专门的按钮,你可以用...

    Hash、md5校验工具-哈希计算器

    Hash md5校验工具 是一款小巧好用的哈希计算器 Hash也是一款md5校验工具 Hash支持文件拖放 速度很快 可以计算文件的 MD5 SHA1 CRC32 的值 软件特色: 支持多个文件或文件夹拖放操作; 支持参数启动 参数为一个...

    java应用开发

    1.哈西表MyHash定义如下: Hashtable MyHash=new Hashtable(); 查看下列语句: MyHash.put(“ten”,new Integer(10)); MyHash.put(“ten”,”Hello”); System.out.print(MyHash.size()); 结果为( )。

    支持文件和文件夹的Hash计算工具

    多线程hash计算工具。安全可靠,电子数据提取固定必备。支持多线程MD5、SHA256、SHA512等多种hash计算,支持批量计算。

    一致性哈希

    * $servers[$this->myHash($key) % 2] 这样得到其中一台服务器的配置,利用这个配置完成分布式部署 * 在服务器数量不发生变化的情况下,普通hash分布可以很好的运作,当服务器的数量发生变化,问题就来了 * 试想...

    Digest-HMAC:HMAC for Perl

    $digest = hmac($data, $key, \&myhash); print hmac_hex($data, $key, \&myhash); # OO style use Digest::HMAC; $hmac = Digest::HMAC->new($key, "Digest::MyHash"); $hmac->add($data); $hmac->addfile(*...

    wnmp(win+nginx+php+mysql)官方安装包

    - MyHash.exe - reMe.Md # 说明 所有文档均来自官网下载文件,内附MD5校验码(与官网一致)。某些包下载速度极慢(下载共用了5小时),为方便大家而上传的资料 #更新时间 2018-5-7(安装包均是 截止今日,官网发布的...

    c#哈希算法的实现方法及思路

    有想过hash[“A1”] = ... 代码如下:static void Main(string[] args) { MyHash hash = new MyHash(); hash[“A1”] = DateTime.Now; hash[“A2”] = 1; Console.WriteLine(Convert.ToString(hash[“A1”])); 

    一个c++实现的哈希表类

    程序的具体实现如下:本程序是用模板类myhash来实现,包括protected和public属性成员。其中protected成员有*ht(自定义散列表指针)、*empty(bool类型指针,功能是将元素值空、m(散列表容量)、p(除留余数法的除数)...

    AngularJs返回前一页面时刷新一次前面页面的方法

    要求: 页面A进入到页面B,在页面B处理完后返回页面...以 ‘http://localhost/$location/21.1 $location.html#/foo?name=bunny#myhash’ 这个路径为例: 1. 获取当前完整的url路径: $location.absUrl(): // http://loca

    js/jquery解析json和数组格式的方法详解

    在解析之前,我们必须弄清楚几个概念:数组,关联数组以及json之间有哪些区别和联系点? 一.概念介绍1....1.语法:var myhash= {”key1″:”val1″, “key2″:”val2″ };//obj 2.varmyhash= {key1:”v

    一个c++实现的哈希表类-C++文档类资源

    在程序中我们对关键字key应用散列函数H(key)来判断关键字key是否在散列表中,...程序的具体实现如下:本程序是用模板类myhash来实现,包括protected和public属性成员。其中protected成员有*ht(自定义散列表指针)、*e

    total commander

    2、精选实用工具:集成 Everything、MyHash、Notepad2、SwitchOFF 等工具,可实现文 件快速搜索、校验和计算、文本编辑、智能关机等功能; 3、拼音首字母定位:集成 QuickSearch eXtended 部分组件,实现中文...

    Go语言常见哈希函数的使用

    myhash.go /** * Created with IntelliJ IDEA. * User: liaojie * Date: 12-9-8 * Time: 下午3:53 * To change this template use File | Settings | File Templates. */ package main import ( crypto/md5 ...

Global site tag (gtag.js) - Google Analytics