文章插圖

文章插圖
最近想做一個文件管理庫,發現文件多到一定程度后只用文件名來管理有些困難,想嘗試下用其它方法來管理文件,這時想起來各類網盤工具中的“秒傳”功能,在傳文件時,幾個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了,結合文件大小,最后修改時間,創建時間等因素來做文件的唯一標識(找出文件有多少個副本),這個方法并不好,因為文件的元信息是可以隨意改動的,要造出兩個元信息完全一致的文件并不困難 。
經人指點后,感覺還是要用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);#文件尾部4kbreturn md5($str);}else{ //文件不太,不抽樣,直接計算整個文件的hashreturn md5_file($path);}}這里只是測試16kb以上的文件就用了抽樣計算,實際應用中16k的文件太小了,大于16kb的文件太多,中間修改了一些內容很會產生重復 。應該設置的更大一些 。md5存在重復可能,在md5基礎上再結合文件類型,文件元信息等就可以對文件做唯一標識,避免文件重復,從而建立文件指紋庫 。
當然要實現文件“秒傳”要做的遠遠不止這些,這個只是實現原理算法 。
- gitlab更改密碼 gitlab怎么改密碼
- 年輕人都有的養生誤區 簡單又實用的養生小零食
- 蘋果的app打不開怎么回事 蘋果手機app打不開怎么回事?解決方法介紹
- 邱勝翊的弟弟邱翊橙資料 出道經歷和作品介紹
- md5加密后如何解密 md5加密解密流程
- 介紹10個常用養生要穴 幫你養生防病
- ps制圖簡單圖片教程視頻 ps制圖簡單圖片教程517o7Cn
- 免費簡單的ppt模板 ppt簡單模板免費下載
- spss軟件怎么使用教程 spss的簡單應用
- md5校檢工具 md5工具使用方法
