附录
URL安全的Base64编码
URL安全的Base64编码适用于以URL方式传递Base64编码结果的场景。该编码方式的基本过程是先将内容以Base64格式编码为字符串,然后检查该结果字符串,将字符串中的加号+
换成中划线-
,并且将斜杠/
换成下划线_
,同时尾部保持填充等号=
。
详细编码规范请参见RFC4648标准中的相关描述。
域名绑定
每个空间都可以绑定一个到多个自定义域名,以便于更方便的访问资源。
比如www.qiniu.com
的所有静态资源均存放于一个叫qiniu-resources
的公开空间中。并将该空间绑定到一个二级域名i1.qiniu.com
,那么如果要在一个HTML页面中引用该空间的logo.png
资源,大概的写法如下:
这样既可以在一定程度上隐藏正在使用七牛云存储的事实,但更大的好处是如果需要从一个云存储迁移到另一个云存储,只需要修改域名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
- 为何需要公开 hash/etag 算法?这个和 “消重” 问题有关,详细见:如何避免用户上传相同的文件。
- 为何在 sha1 值前面加一个字节的标记位(0x16或0x96)?
0x16 = 22,而 2^22 = 4M。所以前面的 0x16
其实是文件按 4M 分块的意思。
0x96 = 0x80 | 0x16。其中的 0x80
表示这个文件是大文件(有多个分块),hash 值也经过了2重的 sha1 计算。
相关工具
qetag 是一个计算文件在七牛云存储上的 hash 值(也是文件下载时的 etag 值)的实用程序。