哈希值

区块链学习(6)区块链

拟墨画扇 提交于 2020-04-03 21:49:34
写了几篇区块链的学习笔记,今天来写写比特币中的区块链。比特币中区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。每个区块从后向前有序地链接在这个链条里,每个区块都指向前一个区块。 区块结构 区块是一种数据结构,存放了多组交易,并且块与块之间相互连接,每个块都指向前一个区块。为了提高性能,一组交易确认打包成块,下面就是区块的结构 区块头中由版本,父区块哈希值,Merkle根,时间戳,难度目标,Nonce。Nonce、难度目标和时间戳会用于挖矿过程。 每个区块通过SHA256算法对区块头进行二次哈希计算而得到一个哈希值叫做区块哈希值,不过只有区块头进行了哈希计算。区块哈希值可以唯一的表示一个区块。还可以用区块高度表示区块,第一个区块高度为0,第二个区块为1,之后的区块依次增加。但区块高度并不能唯一的表示一个区块,若区块链出现分叉就有可能出现两个区块的高度相同。而一个区块中的区块头内储存着它上一个区块的哈希值的引用,而上一个区块的区块头内又有再上一个的区块的哈希值的引用。这样就将各区块组成了区块链。 该区块中的所有交易都是用Merkle树表示的,在区块头中就储存了Merkle树的根。关于Merkle树这个博客讲的是相当详细https://blog.csdn.net/wo541075754/article/details/54632929 有兴趣的可以去看看。 Merkle树

干货分享,值得收藏:搞懂这些redis知识点,还怕干不过面试官?

爷,独闯天下 提交于 2020-02-28 00:49:45
是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义。redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们按照合理的格式解码后,可以变成一个字符串,整数或对象,此时才具有数据类型。 这一点必须要记住。所以任何东西只要能转化成字节数组(byte[])的,都可以存到redis里。管你是字符串、数字、对象、图片、声音、视频、还是文件,只要变成byte数组。 因此redis里的String指的并不是字符串,它其实表示的是一种最简单的数据结构,即一个key只能对应一个value。这里的key和value都是byte数组,只不过key一般是由一个字符串转换成的byte数组,value则根据实际需要而定。 在特定情况下,对value也会有一些要求,比如要进行自增或自减操作,那value对应的byte数组必须要能被解码成一个数字才行,否则会报错。 那么List这种数据结构,其实表示一个key可以对应多个value,且value之间是有先后顺序的,value值可以重复。 Set这种数据结构,表示一个key可以对应多个value,且value之间是没有先后顺序的,value值也不可以重复。 Hash这种数据结构,表示一个key可以对应多个key-value对,此时这些key

北京大学肖臻老师《区块链技术与应用》公开课笔记3

拈花ヽ惹草 提交于 2020-02-14 19:06:38
北京大学肖臻老师《区块链技术与应用》公开课笔记 比特币数据结构篇,对应肖老师视频:https://www.bilibili.com/video/av37065233?p=3 全系列笔记请见:https://blog.csdn.net/Mu_Xiaoye/article/details/104299664 Hash pointer(哈希指针) 指针 在程序运行过程中,需要用到数据。最简单的是直接获取数据,但当数据本身较大,需要占用较大空间时,明显会造成一定麻烦。因此,可以引入 指针 这一概念。当需要获取数据时,只需要按照指针所给的地址,去对应的位置读取数据即可,这样大大节省了内存空间。 在实际中,为了便于程序移植性等原因,指针实际上存储的是 逻辑地址 而非物理地址。 区块链结构本身为一条链表,节点为区块。而传统链表实现,便是通过指针将各个节点串联起来而称为最终的链。如下便是我们最常见的一个链表: 但在区块链系统中,并未采用指针,而是使用了 哈希指针 哈希指针 如下图对于该节点,我们可以看到有两个指针指向这个节点(实际上为一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中内容有关。当节点(区块)中内容发生改变,该哈希值也会发生改变,从而保证了区块内容不能被篡改。 在比特币中,其最基本的数据结构便是一个个区块形成的区块链。 区块链与链表区别1:哈希指针代替普通指针

哈希表

ⅰ亾dé卋堺 提交于 2020-02-04 03:03:51
Hash tabel:哈希表,又称散列表,是一种根据键码值(Key Value)而直接进行访问的数据结构。它把键码值映射到表中的一个位置来存储和访问,映射函数叫做哈希函数(又称散列函数)。在哈希表中,每个存储单元我们称之为位桶数组,而每个位桶数组中的元素是链表数据结构。这里的链表是单向链表,每个链表都有两个数据域,一个用来存放键码key,另一个用来存放值value,除此之外,还有一个标签即哈希值和一个指针域用来指向下一个链表。哈希码实际上是键key对象的内存地址经过处理后的结构,由于每个对象的内存地址一般都不一样,所以哈希码一般也不同,但是也有相同的情况。而哈希值是通过哈希码计算得来的,哈希值是链表在哈希表中存放的具体位置,即位桶数组的下标索引。一般来说,常用的有除法散列法、乘法散列法、全域散列法等。这里只简单说一下除法散列法。除法散列法即用哈希码除以位桶数组的长度然后取余得到哈希值,然后在位桶数组的相应哈希值索引处插入链表。 这里在位桶数组大小的设定上有一定的要求。原则上,我们应尽可能避免位桶数组的大小为2的整数次幂。如果数组的大小是2的p次幂,p为正整数,那么经过除法散列函数计算得到的哈希值的低p位将会和哈希码k的低p位相同。也就是说,哈希值和哈希码之间的相关性很大。如果几个键码的哈希码的低p位相同,经过除法散列函数所得到的哈希值也会相同。这样

借助哈希算法实现高效字符串匹配算法

不羁岁月 提交于 2020-01-28 17:35:11
BF 算法,暴力匹配算法,每次往后移一位 RK 算法,通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的。 但是需要遍历子串中的每个字符,算法整体的效率并没有提高 提高哈希算法 二十六进制来表示一个字符串:把 a~z 这 26 个字符映射到 0~25 这 26 个数字,a 就表示 0,b 就表示 1; 相邻两个子串的哈希值的计算公式有一定关系 ,可以使用 s[i-1]的哈希值很快的计算出 s[i]的哈希值 26^(m-1) 这部分的计算,我们可以通过查表的方法来提高效率。我们事先计算好 26 0、26 1、26 2……26 (m-1),并且存储在一个长度为 m 的数组中,公式中的“次方”就对应数组的下标。当我们需要计算 26 的 x 次方的时候,就可以从数组的下标为 x 的位置取值,直接使用,省去了计算的时间。 只需要扫描一遍主串O(n),模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,整体的 时间复杂度就是 O(n)。 来源: CSDN 作者: lwj~ 链接: https://blog.csdn.net/qq_41754573

分布式哈希和一致性哈希算法

时间秒杀一切 提交于 2020-01-18 17:25:33
目录 1、数据分布 2、哈希方式 3、一致性哈希方式 笔记来自分布式原理一书,供个人学习。 数据分布 单机系统与分布式系统的最大的区别在于问题的规模,即计算、存储的数据量的区别。将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得 分布式系统中的每台机器负责原问题的一个子集。由于无论是计算还是存储,其问题输入对象都是数据,所以如何拆解分布式系统的输入数据成为分布式系统的基本问题,我们称这样的数据拆解为数据分布方式。 哈希方式 哈希方式是最常见的数据分布方式,其方法是按照数据的某一特征计算哈希值,并将哈希值与机器中的机器建立映射关系,从而将不同哈希值的数据分布到不同的机器上。所谓数据特征可以是 key-value 系统中的 key,也可以是其他与应用业务逻辑相关的值。例如,一种常见的哈希方式是按数据属于的用户 id 计算哈希值,集群中的服务器按0到机器数减 1 编号,哈希值除以服务器的个数,结果的余数作为处理该数据的服务器编号。工程中,往往需要考虑服务器的副本冗余,将每数台(例如 3)服务器组成一组,用哈希值除以总的组数,其余数为服务器组的编号。图 2-1 给出了哈希方式分数据的一个例子,将数据按哈希值分配到 4 个节点上。 哈希方式特点 : 1.每个节点只计算一部分数据;每个节点只存储一部分数据。 我们假设节点的数量没有变化(实际上不可能)

哈希算法

試著忘記壹切 提交于 2020-01-15 06:19:50
哈希算法 /*--> */ /*--> */ 哈希算法 什么是哈希算法 哈希算法的应用 应用一:安全加密 应用二:唯一标识 应用三:数据校验 应用四:负载均衡 应用五:数据分片 应用六:分布式存储 哈希算法 什么是哈希算法 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法) 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用 应用一:安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。 对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 第一点很好理解,加密的目的就是防止原始数据泄露,所以很难通过哈希值反向推导原始数据,这是一个最基本的要求。所以我着重讲一下第二点。实际上,不管是什么哈希算法,我们只能尽量减少碰撞冲突的概率,理论上是没办法做到完全不冲突的。 没有绝对安全的加密。越复杂、越难破解的加密算法,需要的计算时间也越长。比如SHA

Java set接口之HashSet集合原理讲解

試著忘記壹切 提交于 2020-01-15 01:56:15
Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection接口更加严格了。 set接口中元素是无序的,并且都会以某种规则保证存入的元素不出现重复。 简述其特点就是: 不允许存储重复的元素 没有索引,也没有带索引的方法,不能使用普通的for循环遍历 Set接口有多个实现类,java.util.HashSet是其常用的子类 下面介绍一下set接口的实现类HashSet HashSet集合的介绍 java.util.HashSet是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet底层的实现其实是一个java.util.HashMap支持 HashSet是根据对象的哈希值来确定元素在集合中的存储位置的,因此具有良好的存取和查找性能。 保证元素唯一性的方式依赖于:hashCode与 equals方法。 代码简单理解 import java.util.HashSet; import java.util.Iterator; public class DemoHashSet { public static void main(String[] args) { // 创建set集合

通用高效的数据修复方法:Row level repair

大憨熊 提交于 2020-01-03 19:25:23
导读:随着大数据的进一步发展,NoSQL 数据库系统迅速发展并得到了广泛的应用。其中,Apache Cassandra 是最广泛使用的数据库之一。对于 Cassandra 的优化是大家研究的热点,而 ScyllaDB 则为其提供了一个新的思路。ScyllaDB 是一个基于 C 的开源的高性能的 Cassandra 的实现,较之 Cassandra 在性能上有了很大的提升。Nodetool repair 是 Cassandra 日常维护的重要一环,今天主要和大家分享一下 ScyllaDB 在这方面的优化。 今天的介绍会围绕下面五点展开: ScyllaDB 介绍 Row level repair 介绍 Row level repair 实现 实验结果 总结 ▌ScyllaDB 介绍 首先给大家简单介绍一下 ScyllaDB: ScyllaDB 的产生背景 我们公司是一家具有较多的底层软件开发经验的公司,团队创始人是 KVM 和 OSv 的作者。对于 Cassandra 数据库的优化,我们进行了一系列尝试。最开始是从操作系统的角度,通过提高操作系统的性能来提高 Cassandra 应用的性能,其效果是提高了 Cassandra 约20%的性能而无法再获得更高的性能提升。为了更好地优化 Cassandra,团队开始思考是否可以重新实现 Cassandra。我们首先开发了一个非常高性能的 C

Coursera: Internet History, Technology, and Security

北城余情 提交于 2020-01-01 14:31:51
课程网址:https://www.coursera.org/learn/internet-history 学习笔记: Week 1: History - Dawn of Early Computing (1940 - 1960) War Time Computing and Conmmunication — High Stakes Research in Computing, and Communication 二战刺激了政府对各种科技的研究投入,由此促进了计算机技术的发展,其中就包括电子计算机的诞生。 为了解密德国的无线电情报,英国布莱切利园( Bletchley Park )内以艾伦·图灵( Alan Turing )为代表的跨学科( cross-disciplinary )团队为电子通信和计算( electronic communication and computation )技术打下了基础。 — Alan Turing and Bletchley Park 在二战期间,布莱切利园是英国政府进行密码解读的主要场所,各行各业的上万名人员在此处工作,轴心国的密码与密码文件,都会送到那里进行解码。布莱切利园是最早的跨学科合作部门。 Bombe 是一台英国机械计算机,致敬波兰密码破译机 Bomba ,对破译德国 Enigma 密码机起到了重要作用,一个 Bombe 可以模拟36个