github:
七牛的 hash/etag 演算法是公開的。演算法大體如下:
1. 對檔案內容做sha1計算;
+---------------+
| <=4mb |
+---------------+
\ | /
\ sha1() /
\ | /
\ v /
+--+-----+
|1b| 20b | 2. 在sha1值(20位元組)前拼上單個位元組,值為0x16;
+--+-----+
| |
| \--- 檔案內容的sha1值
|\------ 固定為0x16
3. 對拼接好的21位元組的二進位制資料做url_safe_base64計算,所得結果即為etag值。
1. 對檔案內容按4m大小切塊;
2. 對每個塊做sha1計算;
+----------+----------+-------
| 4mb | 4mb | ...
+----------+----------+-------
\ | | | /
\ sha1() | sha1() /
\ | | | /
\ v | v /
+-----+-----+-------
| 20b | 20b | ...
+-----+-----+-------
\ | /
\ sha1() /
\ | /
\ v /
+--+-----+
|1b| 20b | 3. 對所有的 sha1 值拼接後做二次 sha1,
+--+-----+ 然後在二次 sha1 值前拼上單個位元組,值為0x96;
| |
| \---- 二次sha1的值
\------- 固定為0x96
4. 對拼接好的21位元組的二進位制資料做url_safe_base64計算,所得結果即為etag值。
使用示例:
var getetag = require("./qetag");
var fs = require("fs")
fs.readfile("檔案路徑", function (err, buf) )
});/或
getetag("檔案路徑", function (v) )
其實我們已經知道原理和nodejs的原始檔了我們只要稍微改一下就可以了
完整原始碼在:
1.sha1演算法
2.uint8array與原生array來替代buffer操作
3.完整原始碼
function getetag(buffer, callback)
function concatarr2uint8(s)
function uint8tobase64(u8arr, urisafe)
return urisafe ? btoa(result).replace(/\//g, '_').replace(/\+/g, '-') : btoa(result);
}function calcetag() else
sha1buffer = concatarr2uint8([[prefix], sha1buffer]);
return uint8tobase64(sha1buffer, true);
}return (calcetag());
}
4.使用示例
效果
關於檔名排序演算法
輸入 a1,a2,a10,a001 我們知道,如果按照字串比較,結果應該是 a001,a1,a10,a2,但我們期望的結果應該是a001,a1,a2,a10.自己寫了乙個演算法,請參考,或者有更好的演算法,請賜教 return value description 0 arg1 less than a...
python os根據檔名自動生成文字
有時我們有很多檔案 如 我們需要對每乙個檔案進行操作。我們還需要乙份檔案的名字來進行遍歷,這時我們首先需要建立乙份檔案名單,有時還會對檔名做一定的篩選,如我們只選擇jpg格式的。本文就是利用乙個資料夾下的幾張完成這些操作 把所有檔名寫入到乙個檔案中。這可以進一步用來遍歷處理資料 usr bin en...
Android打包生成自定義檔名配置
尊重原創,本文 這樣其實感覺很不好,我們在實際開發中經常在上線前會提測很多測試包 beta版 測試完成後會出乙個生產環境的包或者說上線包 release版 有時候乙個專案會設定很多的渠道,多渠道打包的命名也很麻煩,如果按照系統預設的打包命名方式,那麼每次出包我們就需要手動修改檔名,非常麻煩。因此我們...