純前端檔名生成演算法 七牛ETag演算法 示例

2021-09-20 00:20:03 字數 2189 閱讀 7919

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版 有時候乙個專案會設定很多的渠道,多渠道打包的命名也很麻煩,如果按照系統預設的打包命名方式,那麼每次出包我們就需要手動修改檔名,非常麻煩。因此我們...