数组和链表/哈希区别和结构
链表 无连序 无顺序的线性内存存储结构 有单链 双链 循环链(堆区内存/autoreleasepoolPage)链表存储区间离散,占用内存比较宽松,空间复杂度很小,寻址困难,插入和删除容易
数组 内存连续,元素顺序排列的一块内存存储结构 存储区间连续,占用内存比较严重,空间复杂度很大 寻址容易,插入和删除困难
hash 散列表 (数组+链表) 是根据关键码值(Key value)而直接进行访问的数据结构 key根据哈希算法算出哈希值 放在哈希表数组的指定位置(如果有其他元素有相同的哈希值进来 以链表的形式存储 链表最多长8 多了以红黑树的形式存储)
NSArray 和 NSSet区别
NSSet和NSArray功能性质一样,用于存储对象,属于集合
NSSet属于 “无序集合”,在内存中存储方式是不连续
NSArray是 “有序集合” 它内存中存储位置是连续的
NSSet,NSArray都是类,只能添加对象,如果需要加入基本数据类型(int,float,BOOL,double等),需要将数据封装成NSNumber类型
由于NSSet是用hash实现的所以就造就了它查询速度比较快,但是我们不能把某某对象存在第几个元素后面之类的有关下标的操作
冒泡: 第一个和第二个比对 选出一个最值到数组最后 重复比对完成排续
选择: 用第一个和后面所有比对 如果大于或者小于第一个置换 选出一个最值放在
第一个位置, 然后用第二个重复操作
快速: 填坑拆分法 选出一个基准数(一般第一个),从后向前找一个小于基准数的放 入第一个元素位置,从前往后找个大于基准数的放入前面移动元素的位置,在从 后面移动位置继续从后向前寻找小于基准数的元素放入前面移动元素的位置, 直到基准数前的数据小于基准数,后面的数据大于基准数完成一次循环.以基准 数为点拆分数组,继续上边的过程完成排续
插入: 第一个元素认为是一个有序数组 然后从第二个元素判别是否大于第一个元 素放入前面或者后面,第三个依次和一二比对放在对应的位置,依次排续
希尔: 插入的进阶版 有个增量的概念 第一个元素和增量元素比较 然后减少增量继 续比较 最后增量一定为1 增量最好取值是1 5 19 41 109 等
归并: 分治 归并 先划分数组为多个子数组 然后在排续合并 排续是申请一个缓 存数组比对要合并的数组的元素,按大小依次放入缓存数组完成排续
FMDB FMDatabase —— 一个FMDatabase对象就代表一个单独的SQLite数据 库 用来执行SQL语句
FMResultSet —— 使用FMDatabase执行查询后的结果集
FMDatabaseQueue —— 用于在多线程中执行多个查询或更新,它是线程安全的(串行队列)
并发:如果想要并发 就要创建多个FMDatabase对象 这个和数据库访问对象单例唯一冲突 并且sqlite只允许多个线程同时读取或者一个线程同时写入数据库 多个一起写入有查询资源database is locked的可能
Base64加密
把原本是 8 个 bit 一组表示数据,改为 6 个 bit 一组表示数据,不足的部分补零,每两个 0 用 一个 = 表示;
用 base64 编码之后,数据长度会变大,增加了大约 1/3;
虽然 base64 可以作为加密,但是 base64 能够逆运算,非常不安全!
base64 编码有个非常显著的特点,末尾有个 ‘=’ 号;
对称加密
加密/解密使用相同的密钥,加密和解密的过程是可逆的。
加密过程是先加密,再base64编码;解密过程是先base64解码,再解密。
适用业务场景:1.网络请求过程中的敏感信息,请求的时候用AES加密(加密算法)请求数据,服务端返回的时候客户端去解密;2.如果有数据库的时候,数据库里面的数据也可以加密好给到客户端,防止被人破解。
非对称加密
公钥是公开的,私钥保密加密处理安全,但是性能极差。
使用场景:1.比如支付宝开放平台的支付业务,支付宝会让你生成公私钥(openssl可以直接生成),私钥放在自己的服务端(切记),公钥上传到支付宝的商户平台,拿到订单信息的时候,请求服务端通过私钥签名后的订单信息,然后调用支付宝的sdk,支付宝会拿公钥来验签,验证成功之后才会进入支付选项。2.Https网络请求的SSL层。