对象存储

  • 附录

    最近更新时间:2017-01-19 16:38:53

    URL安全的Base64编码

    URL安全的Base64编码适用于以URL方式传递Base64编码结果的场景。该编码方式的基本过程是先将内容以Base64格式编码为字符串,然后检查该结果字符串,将字符串中的加号+换成中划线-,并且将斜杠/换成下划线_

    详细编码规范请参考RFC4648标准中的相关描述。

    域名绑定

    每个空间都可以绑定一个到多个自定义域名,以便于更方便的访问资源。

    例如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值。
    
    • 为何需要公开 hash/etag 算法? 这个和 “消重” 问题有关,详细见:如何避免用户上传相同的文件

    • 为何在 sha1 值前面加一个字节的标记位0x160x96

      0x16 = 22,而 2^22 = 4M。所以前面的 0x16 其实是文件按 4M 分块的意思。
      0x96 = 0x80 | 0x16。其中 0x80 表示这个文件是大文件(有多个分块),hash 值也经过了2重的 sha1 计算。

    qetag算法

    qetag 是一个计算七牛云存储上文件 hash 值(也是文件下载时的 etag 值)的实用程序。

    以上内容是否对您有帮助?
  • 提交工单