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