文件md5是什么(文件md5加密算法)

最近想做一个文件管理库,发现文件多到一定程度后只用文件名来管理有些困难,想尝试下用其它方法来管理文件,这时想起来各类网盘工具中的“秒传”功能,在传文件时,几个G的文件一下就传上去了,但其实就没传,原理据说就是计算文件的md5值,然后检查系统里已经有这个文件了,就不用在上传了,给用户显示“你的文件已经秒传成功”。

另外日常使用的git在提交文件时也有类似的操作,但用的不是md5而是sha1,打开“.git/objects/ ”目录里面就是sha1算法生成的文件。

sha1和md5的作用是相同的,但sha1碰撞难度更高,有更好的安全性,但在一般情况下,md5就已经够用了。

动手开始写代码,代码运行起来后,遇到了第一个困难,”磁盘占用率太高”,记得以前用机械硬盘时,windows动不动就磁盘占用率100%,用了各种办法都没法解决,以为这是微软在提示用户,你的硬盘应该升级了,最后只好升级固态硬盘解决了这个问题,没想到今天又遇到了这个问题。

我用的是php的md5_file()函数计算文件的md5值,当计算2G以上mp4文件的md5值时cpu 内存都正常,磁盘占用却率升到70%以上。于是我更换了编程语言,看是否还有这个问题。

首页找到了一个python计算文件md5值的封装,但测试下来也是一样的问题,磁盘占用率太高,于是又用上了js,在github找到了spark-md5.js这个库,在浏览器前端计算文件的md5值,发现虽然没有磁盘占用率太高的问题,但浏览器的内存占用又太高了。

于是就想能不能不判断下文件大小,对太大的文件不计算md5了,结合文件大小,最后修改时间,创建时间等因素来做文件的唯一标识(找出文件有多少个副本),这个方法并不好,因为文件的元信息是可以随意改动的,要造出两个元信息完全一致的文件并不困难。

经人指点后,感觉还是要用md5才行,但对于太大的文件,可以并不计算整个文件的md5,而是抽取文件部分内容计算hash。因为并不需要文件的全部内容。

对于太大的文件使用:文件大小+内容

抽样(头、中、尾或每隔xx字节抽样一次哈希),写了一段php代码来验证这一思路,发现可行。测试下来没有磁盘占用率太高的情况,也不吃内存,没有性能问题,

function file_md5_16k($path){
  $size=filesize($path);//取得文件大小
  if($size>16384){//如果文件大于16kb
    $str=$size;
    $str.=file_get_contents($path,null,null,0,4096);#文件头部4kb
    $str.=file_get_contents($path,null,null,(($size/2)-2048),4096);#文件中部4kb
    $str.=file_get_contents($path,null,null,($size-4096),4096);#文件尾部4kb
    return md5($str);
  }else{ //文件不太,不抽样,直接计算整个文件的hash
    return md5_file($path);
  }
}

这里只是测试16kb以上的文件就用了抽样计算,实际应用中16k的文件太小了,大于16kb的文件太多,中间修改了一些内容很会产生重复。应该设置的更大一些。

md5存在重复可能,在md5基础上再结合文件类型,文件元信息等就可以对文件做唯一标识,避免文件重复,从而建立文件指纹库。

当然要实现文件“秒传”要做的远远不止这些,这个只是实现原理算法。

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 微信扫码支付限额(微信扫码能支付10万吗)

    微信支付限额分两种情况,一种情况是使用微信零钱支付的限额,每年限额是20万,而且同一个身份证注册的微信帐号共享此额度;另一种情况是微信支付采用银行卡或者信用卡的限额,这个就跟所绑定…

    2022年4月8日
  • 焊工证怎么办(2022年招焊工)

    目前市面上常见的电焊工证分为以下四种,小编今天就给大家讲解这四种电焊工证的区别,及报考流程。 焊工有四种、你有几种呢! 1、焊工职业资格证:2020年底水平评价类分批次退出职业技能…

    2022年6月18日
  • 鲁大师手机跑分排行榜(鲁大师手机跑分排行榜2022)

    7月安卓新发布手机流畅榜数据来自鲁大师APP 07.01日-07.31日数据,榜单只筛选在这期间新发布的机型。部分新机测试数据较少或为工程机数据,分数不稳定。榜单展示分数为鲁大师数…

    2022年6月11日 投稿
  • 优盘启动盘工具哪个好用(u盘启动盘制作步骤)

    Ventoy是免费开源的启动盘制作工具,操作非常方便,我们可以通过它轻松的制作多系统启动盘,支持Windows、Linux、Unix等常见系统,无需反复格式化。 Ventoy解压即…

    2022年1月23日 投稿
  • nvidia是什么显卡(英伟达显卡是什么档次)

    大家应该知道显卡分N卡和A卡,这个N卡指的是英伟达(NVIDIA),A卡之前是ATI,后来被AMD收购了,现在的A卡指的就是AMD显卡。如果是为了玩游戏选显卡肯定是要选N卡,因为A…

    2022年6月15日 投稿
  • 特别出演和友情出演是什么意思(特邀主演和领衔主演的区别)

    近几年随着内地娱乐产业的兴起,越来越多的古装电视剧出现在我们的面前,不过很多人在追剧的时候,同时也会发现一个问题,就是经常在电视剧里面看到,很多主演,比如说领衔主演,联合主演,特别…

    2022年5月24日
  • 住房公积金有利息吗(公积金10万元一年利息能多少)

    自1991年上海成功试行公积金制度、之后在全国推广开以来,住房公积金已经走过了30年左右的历史。到如今,作为“五险一金”的重要组成部分,住房公积金已经成为了各大企业招聘员工的一项重…

    2022年4月3日
  • 文员的工资一般是多少(文员工资6000正常吗)

    对于大学生来说,毕业后面临很多不同的选择,有的会直接步入到社会找一份工作,有的选择继续深造,让自己的学历更有优势。 大学生的增多,也让就业形势更加严峻,部分岗位对学生要求很高,学生…

    2022年5月18日 投稿
  • 立知丨端午节的故事

      端午节的起源   中国的端午节为每年的农历五月初五,“端”有“初始”的意思,所以“端五”就是“初五”。端午节还被称为“午日节、五月节、龙舟节、浴兰节、诗人节”等,迄今已有250…

    2022年8月16日 投稿
  • 怎么办理银行卡(个人银行开户最新要求)

    现在随着办银行卡的要求越来越多,以前只要一张身份证就可以办卡的时代早已经结束了。如果你是本地人,或许有户口本之类的就可以办理,如果是外地人就一定要有工作证明才可以申请银行卡。工作证…

    2022年6月7日
品牌推广 在线咨询
返回顶部