导航:首页 > 源码编译 > 哈希树算法

哈希树算法

发布时间:2022-12-20 09:22:19

1. 哪位能讲讲四叉树算法以及其实现原理

1、HMACSHA1的概念
HMACSHA1 是
从 SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码)。此 HMAC
进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。输出的哈希值长度为 160
位,可以转换为指定位数。
上面是微软的标准定义,我看了也没太明白,他的作用一句话来理解:就是确认请求的URL或者参数是否存在被篡改,以
签名为例:发送方(自己)将参数等进行HMAC算法计算,将得到的哈希值(即签名值)与请求的参数一同提交至接收方(端),然后接收方再次将参数等值
进行HMAC算法计算,将得到的哈希值与你传递过来的哈希值进行核对验证,若一样,说明请求正确、验证通过,进行一下步工作,若不一样,将返回错误。
(下面说的够详细了吧,还不理解,留言给我)

2、 OAuth 1.0中用到的哈希算法

/// <summary>

/// HMACSHA1算法加密并返回ToBase64String

/// </summary>

/// <param name="strText">签名参数字符串</param>

/// <param name="strKey">密钥参数</param>

/// <returns>返回一个签名值(即哈希值)</returns>

public static string ToBase64hmac(string strText, string strKey)

{

HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));

byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));

return System.Convert.ToBase64String(byteText);

}
或者写成,原理一样:

public static string HMACSHA1Text(string EncryptText, string EncryptKey)
{
//HMACSHA1加密
string message;
string key;
message = EncryptText;
key = EncryptKey;

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);

return ByteToString(hashmessage);
}

前面都注释了参数含义,就不再说明了。COPY就可使用

注明:页面请引用
using System.Security.Cryptography;

3、介绍另外一种HMACSHA1算法的写法

public static string HMACSHA1Text(string EncryptText, string EncryptKey)

{
//HMACSHA1加密
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(EncryptKey);

byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(EncryptText);
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
return Convert.ToBase64String(hashBytes);
}

2. 什么是哈希算法,哈希函数主要有哪些

额。。LZ是不是看了小说绘的终极解密啊?
我也蛮感兴趣滴。。嘿嘿,
哈希函数是一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系。
将数据元素的关键字K作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。表示为:
Addr = H(key)
为此在建立一个哈希表之前需要解决两个主要问题:
⑴构造一个合适的哈希函数
均匀性 H(key)的值均匀分布在哈希表中;
简单以提高地址计算的速度
⑵冲突的处理
冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。即关键字K1≠K2,但H(K1)= H(K2)。均匀的哈希函数可以减少冲突,但不能避免冲突。发生冲突后,必须解决;也即必须寻找下一个可用地址。 无论哈希函数设计有多么精细,都会产生冲突现象,也就是2个关键字处理函数的结果映射在了同一位置上,因此,有一些方法可以避免冲突。
1.拉链
拉出一个动态链表代替静态顺序储存结构,可以避免哈希函数的冲突,不过缺点就是链表的设计过于麻烦,增加了编程复杂度。此法可以完全避免哈希函数的冲突。
2.多哈希法
设计二种甚至多种哈希函数,可以避免冲突,但是冲突几率还是有的,函数设计的越好或越多都可以将几率降到最低(除非人品太差,否则几乎不可能冲突)。
3.开放地址法
开放地址法有一个公式:Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)
其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,...m-1,称线性探测再散列。
如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)
称二次探测再散列。如果di取值可能为伪随机数列。称伪随机探测再散列。
4.建域法
假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。
LZ先把自己现阶段的函数搞定,会慢慢接触高等的函数滴,感觉蛮刺激的。。

3. 请问大家默克尔哈希树是什么它有什么用处

这是比特币核心代码组成员Greg Maxwell主导的项目,主要给交易平台的审计程序提供一个公开的、可信赖的算法。该算法也被应用到亚马逊的Dynamo项目中,以及分布式数据库Cassandra。
顾名思义,“默克尔哈希树(Merkel Hash Tree)”是一棵树状的数据结构(二叉或多叉),该树状结构的所有节点(昵称“叶子”)都是Hash值。

在审计之前,交易平台向第三方审计者,提供完整的哈希树节点信息,例如每个用户的账户(金额、ID等)审计信息(据以计算节点哈希值的原始数据),以及交易平台的钱包和地址总余额。
因而,交易平台的地址隐私,至少暴露给了第三方审计者。而第三方审计者要对鉴定结果出具意见,承担商业责任。

4. GSP算法的GSP算法描述

GSP算法 基本步骤如下:
1)扫描序列数据库,得到长度为1的序列模式L1,作为初始的种子集
2)根据长度为i 的种子集Li ,通过连接操作和修剪操作生成长度为i+1的候选序列模式Ci+1;然后扫描序列数据库,计算每个候选序列模式的支持度,产生长度为i+1的序列模式Li+1,并将Li+1作为新的种子集
3)重复第二步,直到没有新的序列模式或新的候选序列模式产生为止
产生候选序列模式主要分两步:
连接阶段:如果去掉序列模式s1的第一个项目与去掉序列模式s2的最后一个项目所得到的序列相同,则可以将s1与s2进行连接,即将s2的最后一个项目添加到s1中
修切阶段:若某候选序列模式的某个子序列不是序列模式,则此候选序列模式不可能是序列模式,将它从候选序列模式中删除
候选序列模式[ 的支持度计算:对于给定的候选序列模式集合C,扫描序列数据库,对于其中的每一条序列s,找出集合C中被s所包含的所有候选序列模式,并增加其支持度计数
GSP需要多次扫描序列数据库,在第一次扫描中,对所有的单个项目(1—序列模式)进行计数。利用频繁1—序列模式生成候选频繁2—序列模式,进行第二次扫描并求候选频繁2—序列模式的支持数。使用频繁2—序列模式生成候选频繁3—序列模式,重复以上过程,直到找出所有的频繁序列模式。 哈希树GSP 采用哈希树存储候选序列模式。哈希树的节点分为三类: 1、根节点;
2、内部节点;
3、叶子节点。
根节点和内部节点中存放的是一个哈希表,每个哈希表项指向其它的节点。而叶子节点内存放的是一组候选序列模式。 从根节点开始,用哈希函数对序列的第一个项目做映射来决定从哪个分支向下,依次在第n层对序列的第n个项目作映射来决定从哪个分支向下,直到到达一个叶子节点。将序列储存在此叶子节点。
初始时所有节点都是叶子节点,当一个叶子节点所存放的序列数目达到一个阈值,它将转化为一个内部节点。
候选序列模式支持度的计算
给定一个序列s是序列数据库的一个记录:
1)对于根节点,用哈希函数对序列s的每一个单项做映射来并从相应的表项向下迭代的进行操作 2)。
2)对于内部节点,如果s是通过对单项x做哈希映射来到此节点的,则对s中每一个和x在一个元素中的单项以及在x所在元素之后第一个元素的第一个单项做哈希映射,然后从相应的表项向下迭代做操作 2)或 3)。
3)对一个叶子节点,检查每个候选序列模式c是不是s的子序列.如果是相应的候选序列模式支持度加一。
这种计算候选序列的支持度的方法避免了大量无用的扫描,对于一条序列,仅检验那些最有可能成为它子序列的候选序列模式。扫描的时间复杂度由O(n*m)降为O(n*t),其中n表示序列数量,m表示候选序列模式的数量,t代表哈希树叶子节点的最大容量

5. 哈希算法从原理到实战

引言 

       将任意长度的二进制字符串映射为定长二进制字符串的映射规则我们称为散列(hash)算法,又叫哈希(hash)算法,而通过原始数据映射之后得到的二进制值称为哈希值。哈希表(hash表)结构是哈希算法的一种应用,也叫散列表。用的是数组支持按照下标随机访问数据的特性扩展、演化而来。可以说没有数组就没有散列表。

哈希算法主要特点

        从哈希值不能反向推导原始数据,也叫单向哈希。

        对输入数据敏感,哪怕只改了一个Bit,最后得到的哈希值也大不相同。

        散列冲突的概率要小。

        哈希算法执行效率要高,散列结果要尽量均衡。

哈希算法的核心应用

         安全加密 :对于敏感数据比如密码字段进行MD5或SHA加密传输。

         唯一标识 :比如图片识别,可针对图像二进制流进行摘要后MD5,得到的哈希值作为图片唯一标识。

         散列函数 :是构造散列表的关键。它直接决定了散列冲突的概率和散列表的性质。不过相对哈希算法的其他方面应用,散列函数对散列冲突要求较低,出现冲突时可以通过开放寻址法或链表法解决冲突。对散列值是否能够反向解密要求也不高。反而更加关注的是散列的均匀性,即是否散列值均匀落入槽中以及散列函数执行的快慢也会影响散列表性能。所以散列函数一般比较简单,追求均匀和高效。

        *负载均衡 :常用的负载均衡算法有很多,比如轮询、随机、加权轮询。如何实现一个会话粘滞的负载均衡算法呢?可以通过哈希算法,对客户端IP地址或会话SessionID计算哈希值,将取得的哈希值与服务器列表大小进行取模运算,最终得到应该被路由到的服务器编号。这样就可以把同一IP的客户端请求发到同一个后端服务器上。

        *数据分片 :比如统计1T的日志文件中“搜索关键词”出现次数该如何解决?我们可以先对日志进行分片,然后采用多机处理,来提高处理速度。从搜索的日志中依次读取搜索关键词,并通过哈希函数计算哈希值,然后再跟n(机器数)取模,最终得到的值就是应该被分到的机器编号。这样相同哈希值的关键词就被分到同一台机器进行处理。每台机器分别计算关键词出现的次数,再进行合并就是最终结果。这也是MapRece的基本思想。再比如图片识别应用中给每个图片的摘要信息取唯一标识然后构建散列表,如果图库中有大量图片,单机的hash表会过大,超过单机内存容量。这时也可以使用分片思想,准备n台机器,每台机器负责散列表的一部分数据。每次从图库取一个图片,计算唯一标识,然后与机器个数n求余取模,得到的值就是被分配到的机器编号,然后将这个唯一标识和图片路径发往对应机器构建散列表。当进行图片查找时,使用相同的哈希函数对图片摘要信息取唯一标识并对n求余取模操作后,得到的值k,就是当前图片所存储的机器编号,在该机器的散列表中查找该图片即可。实际上海量数据的处理问题,都可以借助这种数据分片思想,突破单机内存、CPU等资源限制。

        *分布式存储 :一致性哈希算法解决缓存等分布式系统的扩容、缩容导致大量数据搬移难题。

         JDK集合工具实现 :HashMap、 LinkedHashMap、ConcurrentHashMap、TreeMap等。Map实现类源码分析,详见  https://www.jianshu.com/p/602324fa59ac

总结

        本文从哈希算法的原理及特点,总结了哈希算法的常见应用场景。

        其中基于余数思想和同余定理实现的哈希算法(除留取余法),广泛应用在分布式场景中(散列函数、数据分片、负载均衡)。由于组合数学中的“鸽巢”原理,理论上不存在完全没有冲突的哈希算法。(PS:“鸽巢”原理是指有限的槽位,放多于槽位数的鸽子时,势必有不同的鸽子落在同一槽内,即冲突发生。同余定理:如果a和b对x取余数操作时a%x = b%x,则a和b同余)

        构造哈希函数的常规方法有:数据分析法、直接寻址法、除留取余法、折叠法、随机法、平方取中法等  。

        常规的解决哈希冲突方法有开放寻址法(线性探测、再哈希)和链表法。JDK中的HashMap和LinkedHashMap均是采用链表法解决哈希冲突的。链表法适合大数据量的哈希冲突解决,可以使用动态数据结构(比如:跳表、红黑树等)代替链表,防止链表时间复杂度过度退化导致性能下降;反之开放寻址法适合少量数据的哈希冲突解决。

6. 哈希表算法的哈希表的优缺点

哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。
对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。
哈希表也有一些缺点它是基于数组的,数组创建后难于扩展某些哈希表被基本填满时,性能下降得非常严重,所以程序虽必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。
而且,也没有一种简便的方法可以以任何一种顺序〔例如从小到大〕遍历表中数据项。如果需要这种能力,就只能选择其他数据结构。
然而如果不需要有序遍历数据,并且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。

7. 哈希桶算法

通常大家所说的哈希函数也可以称为散列函数,哈希函数的功能只是将你的目标key通过一种映射方法,也可以说是一种函数运算f,最后得到你目标的
hashValue = f(key),这里的函数f就称为哈希函数/散列函数。

可以看到哈希函数的选择是一个很关键的步骤。为了引进哈希桶算法,必然要介绍一下哈希冲突,因为哈希桶就是为了解决哈希冲突的。举个例子,有一组序列为[10,11,21,31,38,48,55],使用的哈希函数为f(key) = key mod 10

这个时候就产生了冲突了,也就是不同的key通过映射后得到了同样值的hashvalue。

哈希桶算法其实就是链地址解决冲突的方法

如上面的例子所示,就可以设置桶的个数为10,也就是f(key)集合的个数,而这样的话,hashvalue就可以作为桶的索引,将10,11分别通过f(key)得到0,1则可将这几个key放入桶0, 1的首地址所指的内存中,然后处理值为21的key,得到hashvalue值为1,这个时候需要放入桶1中,但桶1的首地址已经有了元素11,怎么办?那么就可以为每个桶开辟一片内存,内存中存放所有hashvalue相同的key,冲突的key之间用单向链表进行存储,这样就解决了哈希冲突,在查找对应key的时候,只需要通过key索引到对应的桶,然后从桶的首地址对应的节点开始查找,就是链表顺序找到,对比key的值,直到找到对应key的信息,所以,在冲突的时候,特别是冲突率比较高的时候,桶内的链表就会很长,使得查找效率比较低,而在最坏的情况下,所有的key都对应同一个hashvalue,当然这种情况不会出现,这样的哈希函数选取的也没有意义了,假设这种情况出现,那么哈希表就退化成了单链表,其他桶内存浪费,且将查找效率从O(1)直接降到了O(N),所以上面才说,哈希函数的选择也是很关键的。

如果相同元素过多,元素在一个桶内部链接过长,反而导致时间复杂度上升。解决思路是桶中元素不再指向链表,而指向一个红黑树。

8. 【区块链与密码学】第5-2讲:哈希函数的构造

本节课程我们将详细讲解哈希函数的构造。

MASH-1 (Molar Arithmetic Secure Hash)是一个基于RSA算法的哈希算法,在1995年提出,入选国际标准ISO/IEC 10118-4;MASH-2是MASH-1的改进,把第四步中的2换成了28+1;由于涉及模乘/平方运算,计算速度慢,非常不实用。

分组密码的工作模式是: 根据不同的数据格式和安全性要求, 以一个具体的分组密码算法为基础构造一个分组密码系统的方法。

基于分组的对称密码算法比如DES/AES算法只是描述如何根据秘钥对一段固定长度(分组块)的数据进行加密,对于比较长的数据,分组密码工作模式描述了如何重复应用某种算法安全地转换大于块的数据量。

简单的说就是,DES/AES算法描述怎么加密一个数据块,分组密码工作模式模式了如果重复加密比较长的多个数据块。常见的分组密码工作模式有五种:

电码本( Electronic Code Book,ECB)模式

密文分组链接(Cipher Block Chaining,CBC)模式

密文反馈(Cipher Feed Back ,CFB)模式

输出反馈(Output Feed Back ,OFB)模式

计数器(Counter, CTR)模式

ECB工作模式

加密:输入是当前明文分组。

解密:每一个密文分组分别解密。

具体公式为:

CBC工作模式

加密:输入是当前明文分组和前一次密文分组的异或。

解密:每一个密文分组被解密后,再与前一个密文分组异或得明文。

具体公式为:

CFB工作模式

加密算法的输入是64比特移位寄存器,其初值为某个初始向量IV。

加密算法输出的最左(最高有效位)j比特与明文的第一个单元P1进行异或,产生出密文的第1个单元C1,并传送该单元。

然后将移位寄存器的内容左移j位并将C1送入移位寄存器最右边(最低有效位)j位。

这一过程继续到明文的所有单元都被加密为止。

OFB工作模式

OFB模式的结构类似于CFB

不同之处:

OFB模式是将加密算法的输出反馈到移位寄存器

CFB模式中是将密文单元反馈到移位寄存器

CTR工作模式

加密:输入是当前明文分组和计数器密文分组的异或。

解密:每一个密文分组被解密后,再与计数器密文分组异或得明文。

具体公式为:

工作模式比较

ECB模式,简单、高速,但最弱、易受重发攻击,一般不推荐。

CBC模式适用于文件加密,比ECB模式慢,安全性加强。当有少量错误时,不会造成同步错误。

OFB模式和CFB模式较CBC模式慢许多。每次迭代只有少数比特完成加密。若可以容忍少量错误扩展,则可换来恢复同步能力,此时用CFB或OFB模式。在字符为单元的流密码中多选CFB模式。

CTR模式用于高速同步系统,不容忍差错传播。

直接设计哈希函数

Merkle在1989年提出迭代型哈希函数的一般结构;(另外一个工作是默克尔哈希树),Ron Rivest在1990年利用这种结构提出MD4。(另外一个工作是RSA算法),这种结构在几乎所有的哈希函数中使用,具体做法为:

把所有消息M分成一些固定长度的块Yi

最后一块padding并使其包含消息M的长度

设定初始值CV0

循环执行压缩函数f,CVi=f(CVi -1||Yi -1)

最后一个CVi为哈希值

算法中重复使用一个压缩函数f

f的输入有两项,一项是上一轮输出的n比特值CVi-1,称为链接变量,另一项是算法在本轮的b比特输入分组Yi-1

f的输出为n比特值CVi,CVi又作为下一轮的输入

算法开始时还需对链接变量指定一个初值IV,最后一轮输出的链接变量CVL即为最终产生的杂凑值

通常有b>n,因此称函数f为压缩函数

算法可表达如下:CV0=IV= n比特长的初值

CVi=f(CVi-1,Yi-1);1≤i≤L

H(M)=CVL

算法的核心技术是设计难以找到碰撞的压缩函数f,而敌手对算法的攻击重点是f的内部结构

f和分组密码一样是由若干轮处理过程组成

对f的分析需要找出f的碰撞。由于f是压缩函数,其碰撞是不可避免的,因此在设计f时就应保证找出其碰撞在计算上是困难的

哈希函数的构造就讲到这里啦,以上三种方式都可以构造哈希函数。下节课我们将学习常用哈希函数,敬请期待!

阅读全文

与哈希树算法相关的资料

热点内容
如何上网上设个人加密账户 浏览:44
linux打开ssh服务 浏览:78
微信位置可以加密吗 浏览:470
算法蛮力法 浏览:438
随机排练命令 浏览:147
python多进程并发 浏览:41
安卓软件安装如何躲避安全检测 浏览:647
奇幻潮翡翠台源码百度云盘 浏览:187
什么软件可以免费pdf转word 浏览:15
php正则表达式大全 浏览:394
androidntp时间 浏览:299
轮机长命令簿英文 浏览:148
oppo铃声设置被加密怎么处理 浏览:548
粤苗app图形验证码怎么填 浏览:899
管家婆架设云服务器 浏览:254
php的登录界面代码 浏览:997
php开发客户端 浏览:998
theisle测试服怎么搜服务器 浏览:447
广播PDF 浏览:218
单片机编程300例汇编百度 浏览:35