哈希

以太坊之三状态树

喜欢而已 提交于 2020-02-10 17:49:06
正在学习区块链,如果我哪里有错误希望大家指出,如果有任何想法也欢迎留言。这些笔记本身是在typora上写的,如果有显示不正确的敬请谅解。笔记本身也是给我自己写的,所以如果有侵权的请通知我,我立即删除。 3. 状态树 这个数据结构的目的很明显,为了保存每种账户的当前状态,这就和银行的账户很像了,比比特币的UTXO友好很多。 patricia trie 字典树有一点浪费空间,比如下面这个例子。 但是路径patricia trie进行路径压缩后。 因此, 当键值分布比较稀疏的时候路径压缩效果比较好 ,不是说那些公共的前缀多就好,而是说地址之间没有什么共同点,随机性很大。这正好符合以太坊的特点。其实不光是以太坊,比特币也是这样的,为了保证地址之间没有冲突,地址长度大是唯一的办法,而地址一长自然就稀疏了。 merkel patricia trie 这个的改变非常明显,就是用哈希指针代替普通指针。普通指针内存放的是数据的地址,哈希指针内存的是哈希值,具体的地址要由哈希值再次查询。 modify merkel patricia trie 实际中使用的MPT树是修改过的,具体的修改内容看下图 ![avatar][pic3-3] 一共有四个账户,就是右上角a7开头的那四个账户,其中第一个有45.0以太币,第二个有1.00WEI,以此类推。整棵树分为extension nod、branch

Hash算法(含python实现)

一个人想着一个人 提交于 2020-02-10 07:26:18
1. 简介 哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。 这种散列变换是一种单向运算,具有 不可逆性 即不能根据散列值还原出输入信息,因此严格意义上讲 Hash算法是一种消息摘要算法 ,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。 2. 应用 Hash主要应用在数据结构以及密码学领域。 在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的 快速性 ,并且要保证hash 均匀分布 ;而应用在密码学中就要优先考虑 抗碰撞性 ,避免出现两段不同明文hash值相同的情况发生。 2.1 在密码学领域的应用 在密码学中,Hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。比如一些登陆网站并不会直接明文存储用户密码,存储的是经过hash处理的密码的摘要(hash值),当用户登录时只需要对比输入明文的摘要与数据库存储的摘要是否相同;即使黑客入侵或者维护人员访问数据库也无法获取用户的密码明文,大大提高了安全性。 2.2 在数据结构中的应用 使用Hash算法的数据结构叫做哈希表,也叫散列表,主要是为了提高查询的效率。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫做哈希表

Hash哈希(一)

眉间皱痕 提交于 2020-02-10 07:26:01
Hash哈希(一)    哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知识。本文参考了很多博文,感谢大家的无私分享。 基本概念    Hash,一般翻译做“散列”,也有直接音译为“哈希”的。那么哈希函数的是什么样的?大概就是 value = hash(key),我们希望key和value之间是唯一的映射关系。   大家使用的最多的就是哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数或散列函数。    实际中的Hash主要有两种应用:加密和压缩。 在加密方面,Hash哈希是把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值,最广泛应用的Hash算法有MD4、MD5、SHA1。 在压缩方面,Hash 哈希 是指把一个大范围映射到一个小范围,往往是为了节省空间,使得数据容易保存。 Hash的特点    主要原理就是把大范围映射到小范围,因此输入范围必须和小范围相当或者比它更小,否则增加冲突。   Hash函数逼近单向函数,所以可以用来对数据进行加密。(单项函数:如果某个函数在给定输入的时候

数据结构中的hash

自作多情 提交于 2020-02-10 07:25:50
最近接触数据结构的时候突然发现一直在使用哈希表,哈希算法。那么到底什么是哈希(hash)。查找资料发现一个比较有意思的解释,在此分享一下。 人家说的很好我就直接粘过来。 ============================================================================================================================ 但凡是从事过计算机行业的人,多多少少都会听说过这个概念,但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统称为哈希(这么叫好听,哈希=散列),通过百度以及谷歌都没有直接找到Hash的定义,而是找到了一些相关的概念,哈希算法,哈希函数,哈希表等概念。 我所理解的哈希是指一个过程,这个过程就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值。这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。 哈希函数、算法 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改一个字母的段落,随后的哈希都将产生不同的值

面试专题 HashMap如何在Java中工作

萝らか妹 提交于 2020-02-07 15:35:47
通过优锐课的java学习分享中,了解了企业的面试题型,分享给大家学习。 HashMap问题在工作面试中很常见。 这是HashMaps在Java内部如何工作的一些深入说明。 HashMap在内部如何工作已成为几乎所有访谈中的一个普遍问题。 几乎每个人都知道如何使用HashMap或HashMap与Hashtable之间的区别。 但是,当问题为“ HashMap如何在内部工作?”时,许多人会失败。 这个问题的答案是,它基于哈希原理工作,但听起来并不那么简单。 哈希是一种使用算法将唯一代码分配给变量或属性的机制,从而可以轻松进行检索。 真正的哈希机制在应用于同一对象时应始终返回相同的hashCode()。 然后是一个问题:“哈希如何帮助存储和检索HashMap中的值?” 许多人会说该值将存储在存储桶中,并使用键进行检索。 如果你认为这是有效的,那么你绝对是错误的。 为了证明这一点,让我们看一下HashMap类: /** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry[] table; 那么HashMap中Entry []的用途是什么? HashMap将对象存储为Entry实例,而不是键和值。 什么是入门班? HashMap有一个称为Entry

(知识点补充二)merkle树和MB-Tree

大城市里の小女人 提交于 2020-02-07 08:51:31
merkle 树结构(M-Tree) Merkle hush Tree用于验证一组数据值。使用最简单的形式解决适合主存的点查询和数据集查询认证问题。M-Tree是二叉树,其中叶节点包含数据值的hush,非叶子节点包含其两个子节点hash of the concatenation值。 查询任何一个数值的真实性需要对比计算log (n) 个hush值,因为 其他结构 我们还提供了所有技术的分析成本模型,给出了各种性能指标。本文主要贡献:详细的分析建模,使用户能够决定哪种结构最能满足他们的需要。 介绍三个应用在静态场景(即在外包数据库中所有者的和服务器之间不发生数据更新)中保证查询正确性和完整性的三个方法: 1. Aggregated Signatures with B±trees(ASB-Tree) 首先,所有者分别对数据库中所有连续的元组取hush值并进行签名,假设某种排序次序方式为A。 给定两个连续的元组r i ,r j ,owner将(r i ,s i )发送给服务器,其中s i =S(r i |r j ),‘|’是表示字符串的规范配对,这些字符串可以唯一地被解析回其两个组件中;第一个和最后一个元组可以与特殊标记记录配对。 为了提高服务器的查询效率,在属性A的顶部构建B+树。 服务器可以为所有结果发送一个组合签名S π ,而不是每个查询结果都发送一个签名

Git2

我与影子孤独终老i 提交于 2020-02-07 04:13:23
1.查看分支 git branch $git branch [-v/vv] 2.创建分支 git branch $git branch 分支名 根据当前所在分支(master)创建一个名为test的分支,但是并不切换到新分支,仍然保持在master分支。 3.查看图形分支 gitk $gitk 可以进入了图形界面,然后选择新建视图,选择remember和勾选全部,以后就可以直接用这个方式打开视图。同时我们也可以用 gitk --all 命令来打开图形界面,并显示所有分支。 4.切换分支 git checkout $git chechout test 可以用 git checkout -b test 创建test分支并切换到test分支 头分离状态 一般HEAD就是指向某分支的最新提交,当使用 git checkout 哈希值 指令将HEAD指针指向的某个提交节点,HEAD不再指向某个分支的最新提交,此时称为头分离。用 git status 命令查看:HEAD detached at … 头分离状态的使用场景 当我们切换分离头的时候就有如下提示: Note: checking out ‘cbd3348’. You are in ‘detached HEAD’ state. You can look around, make experimental changes and

ThreadLocal的使用及原理

我是研究僧i 提交于 2020-02-06 17:59:10
一、概述 ThreadLocal简单理解就是针对一个线程做资源的共享,通过set()方法把某些资源放到线程中保存,然后通过get方法获取这个资源。它的出现解决了同一个线程中,不同类的方法中可以共享同一个对象或者变量问题。注意他不是为解决并发中多线程的资源共享,这种场景一般需要加锁。而是为了在多线程之间维护每个线程单独持有的资源,不需要加锁。 可以想象ThreadLocal的使用场景是在一个线程中共享数据库连接,虽然我没有看过mybatis,hibernate的源码(后面会研究),但估计这些框架中少不了ThreadLocal。另外在java读写锁中使用ThreadLocal用来保存一个线程重入读锁的次数。 下面我们从ThreadLocal的基础代码结构开始了解源码实现。 二、基础代码结构 以下代码先不用细究,等看了后面set()方法再来认真阅读也可以。从下面代码中我们要明白两个事情: ThreadLocal和对应的变量都是保存在内部类ThreadLocalMap的table数组中。 ThreadLocalMap的Entry使用了弱引用,我们后面会讲解这里使用弱引用的好处。 public class ThreadLocal < T > { /** 生成ThreadLocal的哈希码 */ private final int threadLocalHashCode =

HashMap底层原理及简单实现

♀尐吖头ヾ 提交于 2020-02-04 23:46:50
HashMap可以用键值对来存储对象,所谓键值对,就是可以通过对象来寻找对象,是对数组索引的推广。 底层原理 存储结构 HashMap底层的实现采用了哈希表,基本结构是“数组+链表”。HashMap里面有一个叫table的Entry数组,Entry是一个用作链表节点的类,也就是说,数组的每个元素都对应着一个链表,结构如图所示: 存储过程 当调用HashMap的put方法时 首先,会计算key对象的哈希码,也就是调用它的hashcode()方法,一般是根据地址求出的。 然后,通过特定的算法计算出哈希码对应在 [0,数组长度-1) 区间内的哈希值,例如图中是让哈希码模16,求出对应的哈希值是15; 最后在table数组对应位置的链表中添加value对象(在添加的过程中会比较,将相同key值的对象覆盖掉) 注:两种最极端的计算哈希值算法:1.hashCode / hashCode 退化成一个链表 2.hashCode / 1退化成一个数组 注:为了提高效率,会将模运算换成位运算,当length是2的幂次时,hashCode & (length - 1)等效于hashCode % length 注:JDK8中,当链表长度大于8时,会将链表转化成一颗红黑树,提高查找效率 查找键值对过程 查找的过程类似于存储过程,只不过把存改为找到后返回。 根据key值求出hashCode

Redis分布式集群实战(3)——搭建redis集群及redis集群中添加新结点

前提是你 提交于 2020-02-04 23:46:17
文章目录 一、redis集群简介 1、集群 2、redis集群 3、redis集群的优势 4、redis集群工作原理 5、哈希槽 6、容错 二、实验 实验环境: 2、搭建redis集群 3、redis集群中添加新结点 4、集群重新分片 (1)手动分配哈希槽 (2)自动平均分配哈希槽 5、移除节点 (1)移除从Slave节点 (1)移除Master节点 一、redis集群简介 1、集群 集群是一组相互独立的、通过高速网络互相联通的节点,构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群就是一个独立的服务器。 集群技术是一种通用的技术,其目的是为了解决单机运算能力的不足、IO能力的不足、提高服务的可靠性、获得规模可扩展能力,降低整体方案的运维成本(运行、升级、维护成本)。能在大流量访问下提供稳定的业务,集群化是存储的必然形态。 2、redis集群 Redis 集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),提供在多个Redis节点之间共享数据的程序集。。 Redis 集群并不支持同时处理多个键的 Redis 命令,因为这需要在多个节点间移动数据,这样会降低redis集群的性能,在高负载的情况下可能会导致不可预料的错误。