附錄
URL安全的Base64編碼
URL安全的Base64編碼適用于以URL方式傳遞Base64編碼結(jié)果的場景。該編碼方式的基本過程是先將內(nèi)容以Base64格式編碼為字符串,然后檢查該結(jié)果字符串,將字符串中的加號+
換成中劃線-
,并且將斜杠/
換成下劃線_
,同時(shí)尾部保持填充等號=
。
詳細(xì)編碼規(guī)范請參見RFC4648標(biāo)準(zhǔn)中的相關(guān)描述。
域名綁定
每個(gè)空間都可以綁定一個(gè)到多個(gè)自定義域名,以便于更方便的訪問資源。
比如www.qiniu.com
的所有靜態(tài)資源均存放于一個(gè)叫qiniu-resources
的公開空間中。并將該空間綁定到一個(gè)二級域名i1.qiniu.com
,那么如果要在一個(gè)HTML頁面中引用該空間的logo.png
資源,大概的寫法如下:
這樣既可以在一定程度上隱藏正在使用七牛云存儲(chǔ)的事實(shí),但更大的好處是如果需要從一個(gè)云存儲(chǔ)遷移到另一個(gè)云存儲(chǔ),只需要修改域名DNS的CNAME設(shè)置,而無需更新網(wǎng)頁源代碼。
七牛ETag算法
七牛的 hash/etag
算法是公開的。算法大體如下:
小于或等于4M的文件
1. 對文件內(nèi)容做sha1計(jì)算;
+---------------+
| <=4MB |
+---------------+
\ | /
\ sha1() /
\ | /
\ V /
+--+-----+
|1B| 20B | 2. 在sha1值(20字節(jié))前拼上單個(gè)字節(jié),值為0x16;
+--+-----+
| |
| \--- 文件內(nèi)容的sha1值
|
\------ 固定為0x16
3. 對拼接好的21字節(jié)的二進(jìn)制數(shù)據(jù)做url_safe_base64計(jì)算,所得結(jié)果即為ETag值。
大于4M的文件
1. 對文件內(nèi)容按4M大小切塊;
2. 對每個(gè)塊做sha1計(jì)算;
+----------+----------+-------
| 4MB | 4MB | ...
+----------+----------+-------
\ | | | /
\ sha1() | sha1() /
\ | | | /
\ V | V /
+-----+-----+-------
| 20B | 20B | ...
+-----+-----+-------
\ | /
\ sha1() /
\ | /
\ V /
+--+-----+
|1B| 20B | 3. 對所有的 sha1 值拼接后做二次 sha1,
+--+-----+ 然后在二次 sha1 值前拼上單個(gè)字節(jié),值為0x96;
| |
| \---- 二次sha1的值
\------- 固定為0x96
4. 對拼接好的21字節(jié)的二進(jìn)制數(shù)據(jù)做url_safe_base64計(jì)算,所得結(jié)果即為ETag值。
FAQ
- 為何需要公開 hash/etag 算法?這個(gè)和 “消重” 問題有關(guān),詳細(xì)見:如何避免用戶上傳相同的文件。
- 為何在 sha1 值前面加一個(gè)字節(jié)的標(biāo)記位(0x16或0x96)?
0x16 = 22,而 2^22 = 4M。所以前面的 0x16
其實(shí)是文件按 4M 分塊的意思。
0x96 = 0x80 | 0x16。其中的 0x80
表示這個(gè)文件是大文件(有多個(gè)分塊),hash 值也經(jīng)過了2重的 sha1 計(jì)算。
相關(guān)工具
qetag 是一個(gè)計(jì)算文件在七牛云存儲(chǔ)上的 hash 值(也是文件下載時(shí)的 etag 值)的實(shí)用程序。