当前位置: 移动技术网 > IT编程>移动开发>IOS > 七牛-ETag算法(OC)

七牛-ETag算法(OC)

2020年03月09日  | 移动技术网IT编程  | 我要评论

极品矮人王,西南之窗方言教育网,山大司考互助团

一、摘要

1.七牛上传文件,用hash来唯一标识七牛存储空间中的某个文件,该hash是以etag算法计算出的一段哈希值;

2.算法介绍:;

3.七牛的提供的实现语言中(),没有给出oc实现;

4.参考js代码:;

二、代码

- (void)test2 {
    /*测试链接
     http://yqq.file.mediportal.com.cn/yqq_5b911b43955f06317c6bd792/3974e8eaab11b2dd5b357e60e5a587d1  etag:ftfvrvsdpvf9t_tcfyvsvc-1p6aw
     4m以上文件亲测正确
     */
    
    nsurl *url = [nsurl urlwithstring:@"http://yqq.file.mediportal.com.cn/yqq_5b911b43955f06317c6bd792/3974e8eaab11b2dd5b357e60e5a587d1"];
    nserror *error;
    nsdata * data = [nsdata datawithcontentsofurl:url options:nsdatareadingmapped error:&error];
    nsstring *etag = [self caculateetagwith:data];
    nslog(@"etag------%@", etag);
}

//算法实现
- (nsstring *)caculateetagwith:(nsdata *)data
{
    unsigned long blocksize = 4 * 1024 * 1024;
    nsmutabledata *sha1data = [nsmutabledata data];
    byte prefix = 0x16;
    int blockcount = 0;
    
    unsigned long buffersize = [data length];
    //获取余数
    unsigned long remainder = buffersize % blocksize;
    //获取商
    double fa = (double)buffersize / blocksize;
    //向下取整
    blockcount = floor(fa);
    
    if (buffersize > blocksize) {//大于4m的文件
        nsmutabledata *sha2data = [nsmutabledata data];
        for (int i = 0; i < blockcount+1; i++) {
            nsuinteger length = blocksize;
            if (i == blockcount && remainder > 0) {
                length = remainder;
            }
            //将每个块(包括4m块和小于4m的块)进行sha1加密并拼接起来
            nsdata *subdata = [data subdatawithrange:nsmakerange(i * blocksize, length)];
            [sha2data appenddata:[self sha1:subdata]];
        }
        //将拼接块进行二次sha1加密
        [sha1data appenddata:[self sha1:sha2data]];
    } else {
        [sha1data appenddata:[self sha1:data]];
    }

    if (!sha1data.length) return @"fto5o-5ea0snmlw_75vggjcv2acj";
    
    nsdata *sha1buffer = sha1data;
    if (buffersize > blocksize) {
        //大于4m,头部拼接0x96单个字节
        prefix = 0x96;
    }
    
    byte prebyte[] = {prefix};
    nsmutabledata *mutadata = [nsmutabledata datawithbytes:prebyte length:1];
    [mutadata appenddata:sha1buffer];
    
    //将长度为21个字节的二进制数据进行url_safe_base64计算
    return [self safebase64withsha1str:mutadata];
}

/*
 sha1加密(加密后的data长度为20)
 */
- (nsdata*)sha1:(nsdata *)data
{
    //注:如果用以下代码,转换出的data长度为40
//    const char *cstr = [sourcestr cstringusingencoding:nsutf8stringencoding];
//    nsdata *data = [nsdata datawithbytes:cstr length:sourcestr.length];
//    nsmutablestring* output = [nsmutablestring stringwithcapacity:cc_sha1_digest_length * 2];
//    for(int i = 0; i < cc_sha1_digest_length; i++)
//        [output appendformat:@"%02x", digest[i]];
//    return output;
    
    //sha1data长度为20(cc_sha1_digest_length系统设定为20)
    uint8_t digest[cc_sha1_digest_length];
    cc_sha1(data.bytes, (cc_long)data.length, digest);
    nsdata * sha1data = [[nsdata alloc] initwithbytes:digest length:cc_sha1_digest_length];
    return sha1data;
}

- (nsstring *)safebase64withsha1str:(nsdata *)base64
{
    //base64编码中包含有"+,/,="不安全的url字符串,我们要对这些字符进行转换
    nsstring *base64str = [gtmbase64 encodebase64data:base64];

    nsmutablestring *safebase64str = [[nsmutablestring alloc] initwithstring:base64str];

    safebase64str = (nsmutablestring *)[safebase64str stringbyreplacingoccurrencesofstring:@"+"withstring:@"-"];

    safebase64str = (nsmutablestring *)[safebase64str stringbyreplacingoccurrencesofstring:@"/"withstring:@"_"];

    safebase64str = (nsmutablestring *)[safebase64str stringbyreplacingoccurrencesofstring:@"="withstring:@""];
    
    return safebase64str;
}

说明:url?stat可查看七牛文件的etag值(即hash值),如下:

http://yqq.file.mediportal.com.cn/yqq_5b911b43955f06317c6bd792/3974e8eaab11b2dd5b357e60e5a587d1?stat

     {"fsize":687810,"uploaded":687810,"hash":"ftfvrvsdpvf9t_tcfyvsvc-1p6aw","mimetype":"image/jpeg"}

 

 

github

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网