## 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 值)的实用程序。