导航:首页 > 源码编译 > 源码hash算法介绍和构造方法详解

源码hash算法介绍和构造方法详解

发布时间:2025-04-14 18:50:02

‘壹’ Hermes源码分析(二)——解析字节码

前面一节 讲到字节码序列化为二进制是有固定的格式的,这里我们分析一下源码里面是怎么处理的

这里可以看到首先写入的是魔数,他的值为

对应的二进制见下图,注意是小端字节序

第二项是字节码的版本,笔者的版本是74,也即 上图中的4a00 0000
第三项是源码的hash,这里采用的是SHA1算法,生成的哈希值是160位,因此占用了20个字节

第四项是文件长度,这个字段是32位的,也就是下图中的为0aa030,转换成十进制就是696368,实际文件大小也是这么多

后面的字段类似,就不一一分析了,头部所有字段的类型都可以在 BytecodeFileHeader.h 中看到,Hermes按照既定的内存布局把字段写入后再序列化,就得到了我们看到的字节码文件。

这里写入的数据很多,以函数头的写入为例,我们调用了visitFunctionHeader方法,并通过byteCodeMole拿到函数的签名,将其写入函数表(存疑,在实际的文件中并没有看到这一部分)。注意这些数据必须按顺序写入,因为读出的时候也是按对应顺序来的。

我们知道react-native 在加载字节码的时候需要调用hermes的prepareJavaScript方法, 那这个方法做了些什么事呢?

这里做了两件事情:
1. 判断是否是字节码,如果是则调用createBCProviderFromBuffer,否则调用createBCProviderFromSrc,我们这里只关注createBCProviderFromBuffer
2.通过BCProviderFromBuffer的构造方法得到文件头和函数头的信息(populateFromBuffer方法),下面是这个方法的实现。

BytecodeFileFields的populateFromBuffer方法也是一个模版方法,注意这里调用populateFromBuffer方法的是一个 ConstBytecodeFileFields对象,他代表的是不可变的字节码字段。

细心的读者会发现这里也有visitFunctionHeaders方法, 这里主要为了复用visitBytecodeSegmentsInOrder的逻辑,把populator当作一个visitor来按顺序读取buffer的内容,并提前加载到BytecodeFileFields里面,以减少后面执行字节码时解析的时间。

Hermes引擎在读取了字节码之后会通过解析BytecodeFileHeader这个结构体中的字段来获取一些关键信息,例如bundle是否是字节码格式,是否包含了函数,字节码的版本是否匹配等。注意这里我们只是解析了头部,没有解析整个字节码,后面执行字节码时才会解析剩余的部分。

evaluatePreparedJavaScript这个方法,主要是调用了HermesRuntime的 runBytecode方法,这里hermesPrep时上一步解析头部时获取的BCProviderFromBuffer实例。

runBytecode这个方法比较长,主要做了几件事情:

这里说明一下,Domain是用于垃圾回收的运行时模块的代理, Domain被创建时是空的,并跟随着运行时模块进行传播, 在运行时模块的整个生命周期内都一直存在。在某个Domain下创建的所有函数都会保持着对这个Domain的强引用。当Domain被回收的时候,这个Domain下的所有函数都不能使用。

未完待续。。。

‘贰’ 哈希函数构造方法讲解哈希函数简介

HELLO,哈希函数构造方法讲解,哈希函数简介很多人还不知道,现在让我们一起来看看吧!
1、中文名:哈希函数外文名:Hash Function别名:散列函数表达式:Addr = H(key)作用1:加密作用2:语音识别作用3:散列表领域:计算机算法哈希函数指将哈希表中元素的关键键值映射为元素存储位置的函数。
2、一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。
3、这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。
4、 理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。
本文到此讲解完毕了,希望对大家有帮助。

‘叁’ 深入理解 HashSet 及底层源码分析

HashSet是基于HashMap实现的,主要用于存储不重复的对象。以下是对其底层源码及特性的深入理解:

1. 底层结构核心实现:HashSet的底层实际上是基于HashMap的。HashMap的key用于存储HashSet中的元素,而value则使用一个统一的占位对象。 唯一性保证:由于HashMap的key具有唯一性,因此HashSet中的元素也是唯一的。

2. 特性不允许重复元素:HashSet不允许存储重复的元素。如果尝试添加已存在的元素,添加操作将失败。 无序性:HashSet中的元素没有特定的顺序。它们的存储顺序取决于HashMap的内部实现,通常是基于哈希码的分布。

3. 重要方法构造方法:HashSet的构造方法实际上调用了HashMap的构造方法,从而建立了一个基于HashMap的存储结构。 添加方法:添加元素到HashSet时,实际上是将该元素作为HashMap的key进行存储。如果添加成功,则返回true;否则返回false。 删除方法:从HashSet中删除元素时,实际上是在HashMap中删除对应的key。如果删除成功,则返回true;否则返回false。 iterator方法:HashSet的迭代器是通过获取HashMap的keySet的迭代器来实现的。这样,可以遍历HashSet中的所有元素。 size方法:HashSet的size方法直接调用了HashMap的size方法,以获取当前存储的元素数量。

总结:HashSet的底层源码主要依赖于HashMap的实现。它通过利用HashMap的特性来确保元素的唯一性和无序性。了解这些底层实现细节对于正确使用和理解HashSet至关重要。

‘肆’ 什么是hash

hash(散列、杂凑)函数,其核心功能是将任意长度的数据映射到有限长度的域上。具体来说,它将输入的数据m经过一系列杂糅操作后,生成一个固定长度的数据h,作为数据m的特征(指纹)。不考虑数据块m的大小,输出的值h始终为固定长度。实现hash值的生成,可以将数据块m分成固定长度(如128位),然后依次进行hash运算,通过不同的迭代方法(如前一块的hash值与后一块的hash值进行异或)来实现。如果数据块m不足128位,可以通过补零或补一的方式调整其长度,具体调整方法则由算法指定。

除了基本的hash值生成原理,我们还可以深入探讨hash算法在不同场景下的应用及其特性。首先,hash算法的抗碰撞能力至关重要。它意味着,对于任意两个不同的数据块,它们的hash值相同的可能性非常小;对于一个特定的数据块,找到与之hash值相同的另一个数据块也极其困难。其次,hash算法还具有抗篡改能力,即对于一个数据块,即便是改动其一个比特位,其hash值的变化也会非常显着。

在数据结构中,如哈希表(hashmap)等应用中,hash值(key)的主要作用是加速键值对的查找。这里的key设计要求在于均匀地分配数据,以减少碰撞的发生,确保value能够被有效地分布到不同的桶中。然而,为了提高整体算法的set性能,hash值的生成速度变得尤为重要。例如,Java中的String类就采用了一个简洁的乘加迭代运算来生成hashCode值。

在密码学领域,hash算法的应用主要集中在消息摘要和签名上。通过使用hash算法生成消息摘要,可以确保消息的完整性和验证发送者的真实身份。以知乎为例,用户在登录时输入的密码经过hash算法处理后,网站只保存该hash值,而非原始密码。这样即使黑客获取了hash值,也无法直接推断出原始密码。当用户尝试登录时,网站会重新计算hash值并与存储的原hash值进行比对,确保登录信息的安全性。

考虑到抗碰撞和抗篡改能力的高要求,hash算法在密码学中的设计与应用通常更加重视这些安全特性,而非速度。MD5是一个经典的例子,其输出长度为128位,设计预期碰撞概率极低。即便是被破解后,MD5的碰撞概率上限也达到了一个极小的数值,这意味着找到一个与目标文件相同的hash值需要巨大的计算量。通过观察MD5加密结果,我们可以直观地看到,即使仅改变输入字符串中的少数比特位,其生成的MD5值也会产生显着差异。

虽然构造一个算法,使其在输出长度为128位的情况下具有极高的抗碰撞能力和分布均匀性,同时保持良好的抗篡改能力,看似理想,但至今密码学家尚未找到实现这一目标的算法。然而,根据随机预言机(Random Oracle)的假设,这一目标是可能存在的,尽管尚未被严格构造出来。在密码学中,hash算法的设计和应用不断进步,以适应不同的安全需求,如变色龙哈希(ChameleonHash)等算法的出现,展示了在保持抗碰撞能力的同时,可以提供额外的安全特性,如抗篡改性和可伪造性,以应对复杂的安全挑战。

阅读全文

与源码hash算法介绍和构造方法详解相关的资料

热点内容
在什么app买票便宜 浏览:454
西门子plc编程学习 浏览:9
在日本下什么app 浏览:45
proe偏移命令在哪 浏览:779
macrar解压命令 浏览:752
玉米秸秆压缩草 浏览:213
中点画圆算法代码 浏览:415
微信摇一摇抢红包源码 浏览:315
程序员学院怎么找特定的文章 浏览:6
51单片机开题报告 浏览:202
南丹哪有程序员培训班 浏览:384
androidlinux驱动 浏览:956
爱思助手固件解压文件夹 浏览:84
湖南较好的服务器云服务器 浏览:311
怎么解锁加密word文档 浏览:117
点亮app是什么 浏览:452
安徽滁州政府采购通过什么app 浏览:34
程序运行后命令按钮一定可见 浏览:665
怎么看车机安卓大屏是什么牌子的 浏览:861
服务器mdr怎么修复 浏览:391