Logo Image

code

  • hash的一些记录

    当打开Node或者任何一个开源平台下载代码时候,我们都会很在意该网站是不是属于官方认证… Hash 哈希的理解与运用 当打开Node或者任何一个开源平台下载代码时候,我们都会很在意该网站是不是属于官方认证. 但是即使是官网下载的文件,在传输过程中被劫持.那么我们如何保证自己下载的app或者说源代码又或是zip是属于没有被篡改的呢? 这个时候你会看到 会有一个校验的码. 首先,要想验证文件的完整性和安全性,是基于对该文件的一些数据做算法的摘要的比对. 我们来做一个小测试 $ shasum xray.jpg 501575ac28e10b1632e4ca5d7d69737ce5c532c1 xray.jpg 调出终端 通过Mac osx 自带的命令 shasum, 你可以对一个文件做一个sha算法摘要 什么是hash fuction 哈希函数是一种将可变长度的输入映射到固定长度的输出的算法。该函数的返回值称为哈希值,摘要或哈希。 它主要用于解决密码学的完整性原理。该消息可以在发送方和接收方之间的通信期间进行更改 哈希函数的主要特征是: 定长输出:散列函数接收任何大小的消息(输入),并始终产生相同的输出大小。 效率:一定不会很难执行。 确定性:同一条消息将始终产生相同的哈希值。 要在密码学中使用,它必须具有以下属性: 图像前抗性:给定哈希值,很难找到源于该哈希值的消息。 第二种图像前抗性:给定一条消息m,要找到另一个产生与m相同哈希值的消息n会非常困难。 防冲突性:很难找到产生相同哈希值的两条不同消息。 哈希值的利用举例 文档完整性 密码存储 因为在高级的程序设计中我们可以根据哈希值得唯一性以及可逆推断差的特性来将明文密码转变为加密的密码 唯一的ID 例如 UUID/IDFA/AndroidID 这类代表用户信息唯一的,或比如我们每一次做的 git提交的时候 提交的内容 采用go语言做的 hash 实践 package main import ( "crypto/md5" "crypto/sha1" "crypto/sha256" "fmt" ) func main() { s := "Foo" hmd5 := md5.Sum([]byte(s)) hsha1 := sha1.Sum([]byte(s)) hsha2 := sha256.Sum256([]byte(s)) fmt.
    Read Article
  • 名称来自战争术语 抢滩登陆 (beach head) 目的是更快的将iOS的application启动提速. 让用户更快的打开app !推广一波🤣 开源库 进程访问内存的原理 在计算机中,进程 是操作系统分配给正在运行的程序的一种资源。它可以看作是程序的执行实例,包括程序计数器、寄存器、堆栈和打开的文件等。每个进程都在自己的虚拟地址空间中运行,这使得每个进程都有自己独立的内存空间。 虚拟地址 地址空间划分:操作系统将每个进程的地址空间划分为多个固定大小的页。通常,每个页的大小为4KB 页表创建:操作系统为每个进程创建一个页表,用于将虚拟地址映射到物理地址。页表是一个数据结构,它记录了每个虚拟页对应的物理页的地址。 虚拟地址转换:当进程访问内存时,它使用虚拟地址。操作系统通过查找页表中的映射关系,将虚拟地址转换为物理地址。这个转换过程通常包括两个步骤。 页目录查找:进程的虚拟地址通常被划分为三个部分:页目录索引、页表索引和页内偏移。首先,操作系统使用页目录索引在页目录中查找对应的页表。 页表查找:操作系统使用页表索引在找到的页表中查找对应的物理页的地址 内存访问:当虚拟地址被转换为物理地址后,进程可以使用物理地址来访问内存。这样,进程就可以在自己的虚拟地址空间中进行内存操作,而不需要关心物理内存的实际分布。 为了提高效率和方便管理,又对虚拟内存和物理内存又进行分页(Page)。当进程访问一个虚拟内存 Page 而对应的物理内存却不存在时,会触发一次缺页中断(Page Fault),分配物理内存,有需要的话会从磁盘 mmap 读人数据。 mmap mmap是一种内存映射技术,它允许应用程序将文件或其他设备映射到自己的虚拟地址空间中,从而可以像访问内存一样访问这些数据。mmap可以提供高效的读写文件的方式,并且还可以用于共享内存和匿名内存映射等场景 Page Fault 当进程访问一个虚拟内存 Page 而对应的物理内存却不存在时,会触发一次缺页中断(Page Fault),分配物理内存,有需要的话会从磁盘 mmap 读人数据。通过 App Store 渠道分发的 App,Page Fault 还会进行签名验证,所以一次 Page Fault 的耗时比想象的多 1.虚拟内存允许操作系统摆脱物理 RAM 的限制。虚拟内存管理器创建一个逻辑地址空间(或“每个进程的“虚拟”地址空间)并将其划分为大小统一的内存块,称为页面。处理器及其内存管理单元(MMU)维护一个页表将程序逻辑地址空间中的页面映射到计算机 RAM 中的硬件地址。当程序代码访问内存中的地址时,MMU 使用页表将指定的逻辑地址转换为实际的硬件内存地址。这种转换是自动发生的,并且对于正在运行的应用程序是透明的。 2.对于程序而言,其逻辑地址空间中的地址始终可用。但是,如果应用程序访问当前不在物理 RAM 中的内存页上的地址,发生页面错误。当这种情况发生时,虚拟内存系统会调用一个特殊的页面错误处理程序来立即响应该错误。页面错误处理程序停止当前正在执行的代码,找到物理内存的空闲页面,从磁盘加载包含所需数据的页面,更新页表,然后将控制权返回给程序代码,程序代码可以访问内存地址通常情况下。这个过程被称为寻呼。 3.如果物理内存中没有可用的空闲页面,则处理程序必须首先释放现有页面以为新页面腾出空间。系统如何发布页面取决于平台。在 OS X 中,虚拟内存系统经常将页面写入后备存储。这后备存储是基于磁盘的存储库,其中包含给定进程使用的内存页的副本。将数据从物理内存移动到后备存储称为调出(或“交换出”);将数据从后备存储移回物理内存称为分页(或“交换”)。在 iOS 中,没有后备存储,因此页面永远不会调出到磁盘,但只读页面仍会根据需要从磁盘调入。 4.在 OS X 和早期版本的 iOS 中,页面的大小是 4 KB。在更高版本的 iOS 中,基于 A7 和 A8 的系统向由 4 KB 物理页支持的 64 位用户空间公开 16 KB 页面,而 A9 系统公开由 16 KB 物理页支持的 16 KB 页面。这些大小决定了发生页面错误时系统从磁盘读取多少KB。当系统花费过多的时间处理页面错误以及读写页面而不是执行程序代码时,就会发生磁盘抖动。
    Read Article
  • 计算机的历史

    馬克一號(Mark I)是美國第一部大尺度自動數位電腦 Harvard mark I 馬克一號(Mark I)是美國第一部大尺度自動數位電腦,被認為是第一部萬用型計算機。它的生产和设计者给它起的名字是全自動化循序控制計算機(Automatic Sequence Controlled Calculator,缩写为ASCC),马克一号是它的用户哈佛大學给它起的名字。這部機電式ASCC是由IBM的霍華德·艾肯所設計的,在1944年8月7日搬到哈佛大學。馬克一號的特點為全自動運算。一旦開始運算便無須人為介入。馬克一號是第一部被實作出來的全自動電腦,同時與當年的其他電子式電腦相比它非常可靠。大家認為「這是現代電腦時代的開端」以及「真正的電腦時代的曙光」。 继电器 继电器(Relay),也称电驿,是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关 ”。故在电路中起着自动调节、安全保护、转换电路等作用。 机械式继电器通过控制线路通电 导致线圈产生磁场可以将金属臂下拉闭合 从而可以控制了电路的导通,由于继电器的电臂有质量,并且金属会随着时间的磨损导致,继电器会损坏.在mark2号里面 发热的机箱会吸引了虫子 导致电路无法正常运作. 记录员就将bug(虫子/飞蛾)称之为故障 Diode 二极管 一个热离子二极管就是一个真空管(也称“电子管”),由一个包含着两个电极的密封真空玻璃壳组成:由灯丝加热的阴极,和一个阳极。早期产品的外观和现在的白炽灯泡相当类似。在操作中,一个单独的电流通过由镍铬合金制成的高电阻灯丝(加热器),将阴极加热到红热状态(800-1000℃)后可导致它释放电子到真空。这一过程即热发射。阴极通常涂有碱土金属氧化物,如钡或锶的氧化物。因为它们具有较低的功函数,可使发射的电子数量增加。有些真空管则直接加热钨丝,钨丝则既作为加热器也是阴极本身。交流电会在负极及与其同心的阳极板之间整流,当板子带正电时,静电会从负极处吸引电子。所以电子即从阴极连通到阳极成为了电流。然而当极性反转阳极板带有负电时,阳极板不会发射电子,而阴极也并不会吸引电子,因而没有电流会产生。如此则保证了电流的单向流通,即从阴极流向阳极板。在汞弧阀(具有冷阴极的汞蒸气离子阀)中,一种难熔的导电阳极与一池作为阴极的液态汞之间会形成电弧,电压单位可达数百千瓦,这对高压直流输电的发展起到了促进作用。一些小型的热离子整流器有时候也用汞蒸气填充,以减少他们的正向压降并增加这种热离子强真空器件的电流额定值。整个真空管时代,这种二极管应用于模拟信号,并在消费电子产品(如收音机、电视机、音响系统)的直流供电设备中当做整流器。20世纪40年代,在那些供电设备内的真空管开始被硒整流器所替代,然后在1960年代又被半导体二极管替代。如今,二极管仍然在一些高功率应用场合中使用,由于能够承受瞬变和较好的鲁棒性,使得他们比半导体器件的优势能够显现出来。尤其是音频处理上,真空管基本不存在瞬态互调失真、开关失真及交越失真等影响音质的问题。因此近年来,在音响发烧友和录音棚所用的音频设备中,应用真空二极管的老式音频设备有回潮的迹象,如家用音响系统甚至是吉他效果器。 通过真空,加热金属释放出电子使得电路导通,单向流通特性. Triode vacuum tubes 三级真空管 三极管(英语:Triode)是一个有放大器功能的真空管,在真空的玻璃外壳内有三个电极:包括一个加热的灯丝(或称阴极)、控制栅格(英语:control grid)及金属平板(阳极) 。三极管是由李·德富雷斯特在1906年发明,是第一个电子放大器。也是其他类型真空管如四极管、五极管的祖先。它的发明开创了电子时代,使无线电放大和长途电话成为可能。李·德富雷斯特因为发明三极管,被誉为是电子学之父。现在的三极管只有一厘米左右的长度 通过控制正电压能导通,负电压会阻挡 从而让电路拥有了开关特性,这将是对上文提到的,继电器一个巨大的变革.因为其内部是真空的,没有移动所以使用时间很长,并且在同一时间内 可以做更多次的开合. 晶体管 电晶体由半导体材料组成,至少有三个对外端点(称为极),(C)集极、(E)射极、(B)基极,其中(B)基极是控制极,另外两个端点之间的伏安特性关系是受到控制极的非线性电阻关系。晶体管基于输入的电流或电压,改变输出端的阻抗,从而控制通过输出端的电流,因此晶体管可以作为电流开关,而因为晶体管输出信号的功率可以大于输入信号的功率,因此晶体管可以作为电子放大器。 伟大的发明 IEEE 里程碑式创造. 稳定便宜可靠快速开关,放大,稳流. 为什么是二进制 二进制 0 或者 1 代表真实世界中的开关真假. 计算机之所采用二进制的原因 一个是上面提到的晶体管会有两种形式的存在,并且当时的数学科上有一个专门处理yes/no的学科,叫做布尔代数. 与或非 非:取反, 单个输入 单个输出 通过Not门把电子控制,就可以将真值表用电路来表示了 与: 两个晶体管来控制 或: 两个晶体管来控制 xor 异或 逻辑异或 在数字逻辑中,逻辑算符互斥或闸(exclusive or)是对两个运算元的一种逻辑分析类型。与一般的逻辑或不同,当两两数值相同为否,而数值不同时为真。 二进制(知识点) 基础的二进制 8位 称之为一个byte是ibm创建的词汇 2的8次方 256最大值 American Standard Code for Information Interchange 简称ASCII:8位
    Read Article
  • Go1

    go的一些入门 Go Advantages Go advantages code run fast garbage collection simpler objects concurrency is efficient (并发性好) language machine language assembly language high-level language Compiled 编译型语言 类似C C++ JAVA Interpretation 解释型语言 类似 Python JAVA,当执行的时候回将源代码翻译为机器执行的代码 所以会消耗时间 Object 虽然在go语言中 没有意义上的对象.但是struck 充当了类似的角色 Concurrency并发 如果在没有高并发会遇到 Moore law 18个月的晶体管会翻倍 硬件性能增长收到限制 功耗会增加 parallelism并行 variables 命名规则 keyword避免掉 declarations 申明变量 var x int var 是keyword x 是变量的名称 int 是类型 可以多行命名变量 var x,y,z int 类型 Integer (only integer value ) Floating Point (Fractional decimal value, may use different with hardware) String (seqyebces characters) Init初始化变量
    Read Article
  • ios内存原理(3)

    虽然ARC时代不需要手动管理内存,但是我们仍然要注意循环引用和CoreFoundation对象的引用计数问题… 虽然ARC时代不需要手动管理内存,但是我们仍然要注意循环引用和CoreFoundation对象的引用计数问题 MRC 对象操作 OC中对应的方法 对应的引用计数的化 持有对象 retain +1 释放对象 release -1 废弃对象 dealloc 0 ARC 根据指针来操作引用 在ARC模式下,只要没有强指针(强引用)指向对象,对象就会被释放。在ARC模式下,不允许使用retain、release、retainCount等方法。并且,如果使用dealloc方法时,不允许调用[super dealloc]方法。 ARC模式下的property变量修饰词为strong、weak,相当于MRC模式下的retain、assign。strong :代替retain,缺省关键词,代表强引用。weak:代替assign,声明了一个可以自动设置nil的弱引用,但是比assign多一个功能,指针指向的地址被释放之后,指针本身也会自动被释放。 实现方式是在编译时期自动在已有代码中插入合适的内存管理代码以及在 Runtime 做一些优化。详细的工作原理见 上一篇 内存管理(2) ARC提供四种与内存管理有关的变量标识符,分别是: 关键字 __strong __strong 是默认使用的标识符。只有还有一个强指针指向某个对象,这个对象就会一直存活。 __weak __weak 声明这个引用不会保持被引用对象的存活,如果对象没有强引用了,弱引用会被置为 nil _ unsafe _unretained __unsafe_unretained 声明这个引用不会保持被引用对象的存活,如果对象没有强引用了,它不会被置为 nil。如果它引用的对象被回收掉了,该指针就变成了野指针。 __autoReleasing __autoreleasing 用于标示使用引用传值的参数(id *),在函数返回时会被自动释放掉。 变量标识符的用法如下,在类型和变量名之间: Number* __strong num = [[Number alloc] init]; 属性标识符 @property (assign/retain/strong/weak/unsafe_unretained/copy) Number* num assign表明 setter 仅仅是一个简单的赋值操作,通常用于基本的数值类型,例如CGFloat和NSInteger。 key 含义 strong 表明属性定义一个拥有者关系。当给属性设定一个新值的时候,首先这个值进行 retain ,旧值进行 release ,然后进行赋值操作。 weak 表明属性定义了一个非拥有者关系。当给属性设定一个新值的时候,这个值不会进行 retain,旧值也不会进行 release, 而是进行类似 assign 的操作。不过当属性指向的对象被销毁时,该属性会被置为nil unsafe_unretained 语义和 assign 类似,不过是用于对象类型的,表示一个非拥有(unretained)的,同时也不会在对象被销毁时置为nil的(unsafe)关系 copy 类似于 strong,不过在赋值时进行 copy 操作而不是 retain 操作。通常在需要保留某个不可变对象(NSString最常见),并且防止它被意外改变时使用 unsafe_unretained (1)兼容性,iOS4之前没有weak只能用unsafe_unretained(2)性能考虑,性能比weak要好 ARC下仍然需要注意的内存管理问题 循环引用问题。 当两个对象互相持有对方的强引用时,并且这两个对象的引用计数都不是0的时候,便造成了引用循环,从而使用计数后内存无法得到释放。可以从以下几个方面入手:
    Read Article
  • ios内存原理(2)

    经过前面文档我们大致了解了arc/mrc机制,是为了更好的去做iOS的内存管理 前言 经过前面文档我们大致了解了arc/mrc机制,是为了更好的去做iOS的内存管理.在面对一个对象的时候,从初始化到delloc销毁的过程中进行合适的插入 retain 和 release 做到内存的回收释放♻️,随着iOS的迭代发展,我们开始逐渐采用一种解放程序员的新型管理模式 ARC … 什么是ARC/MRC Manual Reference Counting 是根据对象的引用计数器 reference count 来判断在何时将一个对象所占用的内存回收 Automatic Reference Counting 自动引用计数 是苹果子WWDC2011年引入的,其工作原理下面详细理解,根本上是通过强指针来判断 AutoreleasePool 从main函数开始了解: int main(int argc, const char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 在这个autoreleasepool的block里面 所有的事件,消息,全部转交给了UIApplication来处理,从此可以看出一个iOS应用是完全包裹在自动释放池里面的 通过clang 编译器将main函数转换成了 main.cpp $ clang -rewrite-objc main.m 我们将关注点放在__AtAutoreleasePool这个结构体上面 struct __AtAutoreleasePool { __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();} ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);} void * atautoreleasepoolobj; }; 不难看出我们main函数的工作原理大致上是在初始化时候调用了 void * atautoreleasepoolobj = objc_autoreleasePoolPush(); 然后在析构时候调用了
    Read Article
  • ios内存原理(1)

    在iOS的开发中我们接触到了ARC/MRC这些机制,为了更好的了解其中的原理,我们可以从官方的文档作为入口来看看这些名词背后更深入的意义. 在iOS的开发中我们接触到了ARC/MRC这些机制,为了更好的了解其中的原理,我们可以从官方的文档作为入口来看看这些名词背后更深入的意义. 01内存管理 基本内存管理规则内存管理模型基于对象所有权。任何对象都可以具有一个或多个所有者。只要一个对象至少具有一个所有者,它就会继续存在。如果对象没有所有者,则运行时系统会自动销毁它. 苹果给出了四条准则 管理任何由你自己创建的对象 通过retain来持有一个对象 (在对象方法/init方法中调用 )一般在下面两种情况 当你想将一个对象存储为属性值时 当你想防止一个对象被释放时 当你不再需要这个对象时候 请释放 Person *aPerson = [[Person alloc] init]; // ... NSString *name = aPerson.fullName; // ... [aPerson release]; tips 1.在iOS中涉及到对象持有的是基于一套 NSObject protocol协议 以及一些标准的方法名来实现的,例如alloc,newObject,copy,mutableCopy来实现的 2.管理对象,我们从Apple给出的两个例子 当你担心你的对象alloc后,在return之前调用[object release]导致对象被释放 那么采用autorelease,该方法会在返回对象之后调用release方法 - (NSString *)fullName { NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.lastName] autorelease]; return string; } 下面这种方法是在调用者调用此方法之后 对象被销毁之前达到将对象传递给外面的效果 - (NSString *)fullName { NSString *string = [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; return string; } 我们也可以通过ClassName 或者 id 去完成我们的逻辑操作例如&object指向内存地址 ,所以我们不持有对象就无需去管理对象
    Read Article