自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Now

技术笔记

原创 常用链接

常用学习资源链接

2019-12-04 14:39:12 160 0

原创 分布式系统中时间、时钟和事件序列

在程序中,我们经常需要知道事件序列,在单体应用中,事件序列是较为简单的,最简单的办法就是用时间戳,但在分布式系统中,事件序列是很困难的,Leslie Lamport大神在论文Time, Clocks, and the Ordering of Events in a Distributed Syst...

2019-05-15 23:18:03 399 1

原创 Rust异步之Future

对异步的学习,我们先从Future开始,学习异步的实现原理。等理解了异步是怎么实现的后,再学习Rust异步编程涉及的2个库(futures、tokio)的时候就容易理解多了。 Future rust中Future的定义如下,一个Future可以理解为一段供将来调度执行的代码。我们为什么需要异步呢,...

2020-05-09 15:28:16 69 0

原创 AVL树

在二叉查找树的相关操作中,例如,插入、查找、删除、最大值、最小值等的时间复杂度为`O(h)`,为了避免算法的最坏情况,我们应当使二叉树平衡,以降低树的高度。DSW算法能够实现树的平衡,但有其局限性,只能做全局的平衡,当节点又有变化时,需要重新进行平衡(这个平衡的过程代价较大,等于是一整颗树都参与了...

2020-05-08 13:32:07 26 0

原创 树堆

树堆 树堆,是一种将二叉查找(搜索)树与堆两种数据结构结合在一起的一种数据结构,它首先是一颗二叉查找树同时满足一定的堆性质。我们知道二叉查找树与堆性质是有矛盾的,解决办法就是元素值以二叉查找树的性质分布,每个元素插入时都会随机生成一个优先级,优先级要满足堆性质中父节点大于等于子节点的性质,但不要求...

2020-05-06 13:51:40 33 0

原创 STL关联容器

这里简单学习一下STL关联容器,主要是map、multimap、set、multiset以及unordered_map。前四个底层实现都是利用红黑树实现的,查找算法时间复杂度为`O(log(n))`,而unordered_map从名字上就知道是无序容器,其实现原理类似哈希表,查找算法时间复杂度`O...

2020-05-06 10:32:58 55 0

原创 STL堆实现

堆 堆是十分重要的数据结构,我们常用的优先队列就是基于堆实现的数据结构,堆排序也是基于堆实现的,所以,我们要理解堆的实现,之前自己根据堆的原理自己实现了堆,现在来分析一下STL中堆的实现代码,STL的堆实现相比自己实现的代码肯定要多很多,但原理是一样的,我们下面看一下。 堆的实现 STL中提供了堆...

2020-05-06 10:19:53 61 0

原创 最短路径之Dijkstra算法

在图的应用中,最常用的就是求解各种条件下的最短路径问题,这里Dijkstra迪杰斯特拉算法是求解有权(权值为非负值)图的单源最短路径算法,即只能求出某点到其它点最短距离,并不能得出任意两点之间的最短距离。 经典实现伪代码如下: 1 function Dijkstra(Graph, source...

2020-05-05 22:24:06 107 0

原创 Rust学习资料汇总

列举一些学习Rust的好资料,方便平常学习与查阅。大部分文档在官网Grow with Rust一节都有列出,另一部分是平常学习时涉及到的文档资料。 The Rust Programming Language 这本书当然是要第一本阅读的了,入门首选。 Rust对单元测试的支持是非常友好的,可参考...

2020-04-26 22:24:01 101 0

原创 UUID的学习与思考

我们在进行分布式系统相关开发的时候,经常需要ID号(例如,订单号,消息id号)。如果不是分布式系统的化,生成一个ID号是非常简单的,因为你自己知道自己生成的所有ID号,但是分布式系统环境下,你自己生成ID号的时候你是不知道其他人生成的ID号的,你再按原先的规则生成的ID号可能就与其他人生成的ID号...

2020-03-06 09:07:11 154 0

原创 Protocol Buffers工作原理

这里记录一下学习与使用Protocol Buffer的笔记,优点缺点如何使用这里不再叙述,重点关注与理解Protocol Buffers的工作原理,其大概实现。 我们经常使用Protocol Buffer进行序列化与反序列化。理解Protocol Buffer的工作原理,就要理解序列化与反序列化。...

2020-03-04 17:14:22 94 0

原创 STL常用序列容器学习笔记

这里简要的记述一下STL常用容器的实现原理,要点等内容。 vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而array是静态空间,分配后不能动态扩展。vecotr的实现较为简单,主要的关键点在于当空间不足时,会新分...

2020-01-26 20:10:04 1000 1

原创 堆排序

选择排序 选择排序的基本思路是:每次都从原序列中顺序查找出最小的元素,放入新的序列的下一个位置(在具体实现中,一般是还是放在原序列中,采用依次交换位置的方法)。这种最简单实现的选择排序时间复杂度为O(n2)O(n^2)O(n2)。有没有效率更高的基于选择的排序算法呢?堆排序就是一种,与选择排序一样...

2020-01-17 13:23:09 152 0

原创 跳跃链表

跳跃链表的概念 跳跃链表是有序链表的一个变种,在一个有序链表中,查找一个链表中的元素需要进行一次遍历,时间复杂度为O(n),为了加快查找的过程,能够跳过某些元素呢?一个思路就是牺牲一定的空间换时间,对有序链表建立类似索引的结构加快查找过程,跳跃链表基本上就是通过维护一个多层次的链表,每一层链表中的...

2020-01-14 18:17:14 1935 0

原创 自组织链表

引入跳跃链表的目的是为了加速查找过程。而加速策略其中一个非常重要的观点就是并非所有的元素使用的频率都相同。我们自然希望高频使用的元素在链表的头部,而低频的在链表尾部。单向链表和双向链表需要进行顺序查找以定位某个元素,还可以用某种方法动态地组织链表,从而提高查找效率。有许多不同的方法可以组织链表,比...

2020-01-09 10:39:00 334 0

原创 AES加密算法工作原理

密码学博大精深,这里所说的AES加密算法原理可以理解为AES工作流程,至于为什么这么设计,这么设计为什么是安全的,有待今后的学习与思考。 分组密码设计的两个原则 分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。 混淆是使密文的...

2019-12-10 10:41:56 704 3

原创 分组密码及AES算法初识

对称密码算法 常用对称密码算法AES、Blowfish、DES、RC5等,DES目前认为已不安全,当前使用最多的是AES加密算法,因其应用的广泛,目前主流CPU已经实现了AES-NI(全称是:Advanced Encryption Standard New Instructions),这是针对AE...

2019-12-06 18:30:03 220 0

原创 二叉查找树的Morris遍历算法

二叉查找树的遍历方法有多种,递归实现,利用栈实现,线索树实现,这几种遍历方法,其时间复杂度都为O(n),而空间复杂度递归和栈为O(h),线索树需要额外的标识位来表明是线索还是节点指针,空间复杂度为O(n),当节点数量非常大时,树高h = log(n)仍然较大,有没有其他的遍历算法,其空间效率更高呢...

2019-12-03 19:15:44 206 0

原创 二叉查找树的平衡(DSW)

树适合于表示某些领域的层次结构(比如Linux的文件目录结构),使用树进行查找比使用链表快的多,理想情况下树的查找复杂度O(log(N)),而链表为O(N),但理想情况指的是什么情况呢?一般指树是完全平衡的时候。哪最坏的情况是什么呢?就是树退化为链表的时,这时候查找的复杂度与链表相同。就失去了树结...

2019-12-02 10:07:27 79 0

原创 图的表示与遍历

图是非常重要的数据结构,现实中的很多问题都归结于图的问题,这里我们讨论一下图,关于图的基础:顶点、边等概念可参考文档:Graph Data Stucture,这里不再细述。 图的表示 图有两种表示方法:邻接矩阵、邻接链表。不同的场景及算法可能需要不同的图表示方式,一般情况下当结点数量非常庞大时,会...

2019-11-29 21:47:09 151 0

原创 分布式系统:向量时钟

Lamport时钟存在的问题 使用Lamport时间戳,只是比较事件aaa和bbb各自的时钟值C{a}C\{a\}C{a}和C{b}C\{b\}C{b},无法说明它们之间的关系。也就是说,C{a}&lt;C{b}C\{a\}&lt;C\{b\}C{a}<C{b}不能说明事件a...

2019-08-01 08:49:28 925 2

原创 2019年中总结

转眼间,已经工作N年了,最大的感悟就是是基础要扎实,一定要不断的修习基础,每重新学习一次,都会有新的感悟,再结合工作中实际的项目,思考一下,会有更深的理解。越是基础的东西,越是精华,基础的东西理解透了,再学习新的技术时理解的会非常快。

2019-07-18 18:53:24 235 0

原创 比特币挖矿及源码分析

挖矿流程概述 比特币挖矿,其实就是比特币节点,对交易进行打包出块,获取记账权的同时得到比特币激励。挖矿主要流程如下: 收集网络上广播的交易,进行验证,加入到交易池中; 构造新块——将交易池中的交易打包,选择一条最长的区块链,计算最新块头哈希值作为新块(候选块,还未获得记账权)前一区块哈希; 工作...

2019-07-15 13:41:29 521 0

原创 比特币核心数据结构

我们学习计算机时曾经有这么一个定义:程序=数据结构+算法,对于一个区块链,我认为从技术方面看与程序的定义类似,核心一个是共识算法,一个是核心数据结构,这两点直接决定了这条区块链工作运行原理。比特币的共识算法,在这一篇哈希函数与比特币共识算法PoW中已经讲述了其原理,这一篇主要讲述比特币核心数据结构...

2019-07-12 11:59:27 157 0

原创 Merkle树

Merkle tree Merkle树看起来非常像二叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值,所以有时候Merkle tree也表示为Hash tree,如下图所示: 在构造Merkle树时,首先要对数据块计算哈希值,通常,选用SHA-256等哈希算法。但如果仅仅防止数据不...

2019-07-11 15:09:08 279 0

原创 Bloom过滤器

提出一个问题 在我们细述Bloom过滤器之前,我们先抛出一个问题:给你一个巨大的数据集(百万级、亿级…),怎么判断一个元素是否在此数据集中?或者怎么判断一个元素不在此数据集中? 思考这个问题的时候,最先想到的可能是哈希表,在数据集规模较小的时候,这个方法是可行的,当然,数据集巨大的时候也可以采用分...

2019-07-10 13:35:41 860 0

原创 闪电网络

闪电网络属于状态通道技术范畴,是区块链技术的一个发展方向之一,其核心思想是将本来在链上结算的交易在链下通过状态通道维护中间态,并且在发生纠纷时回到链上仲裁。链上仲裁的公平性和安全性在博弈论上保证了链下交易的对手不会作恶。通过这种方式实现扩容。下面是闪电网络技术概要。 一、闪电网络——币链下扩容方...

2019-07-10 13:25:10 1349 0

原创 比特币交易

理解交易对比特币系统是如何工作的是非常重要的,可以说比特币整个的工作流程就是围绕着交易展开的。下面我们先叙述一下比特币交易流程,在宏观上对交易有个认识,后面会讲一下交易数据结构,具体在程序中是怎么定义的。下面先让我们看一下比特币交易流程。 比特币交易流程 比特币交易并不是通常意义上的一手交钱一手交...

2019-07-09 13:32:43 325 0

原创 哈希表原理

哈希表是最常用的数据结构之一,对于其用法,大家都非常熟悉,这里详细探讨一下其原理。哈希表的底层实际上是基于数组来存储的,当插入键值对时,并不是直接插入该数组中,而是通过对键进行Hash运算得到Hash值,然后和数组容量取模,得到在数组中的位置后再插入。取值时,先对指定的键求Hash值,再和容量取模...

2019-07-08 18:05:07 1171 0

原创 【Rust】双重循环break的问题

在单循环中使用break跳出循环,但如果遇到双重循环或者更多重循环时怎么办呢?与其他语言类似,Rust使用标记标识跳出指定循环。如下所示: fn main() { let a = vec![1;5]; let b = vec![2;6]; 'outer: ...

2019-07-03 18:51:11 617 0

原创 比特币私钥、账户与钱包

对于比特币用户来讲,与它们最直接相关的就是比特币中私钥、账户及钱包了,这里讲述一下这三个概念及相关细节。在这之前,先简单的叙述一下基本的公钥密码学知识。 公钥密码体制(Public-key cryptography) 公钥密码体制分为三部分:公钥、私钥、加密解密算法。公钥密码体制的公钥和算法都...

2019-06-28 09:44:58 4668 0

原创 【Rust】写时复制Cow

写时复制(Copy on Write)技术是一种程序中的优化策略,多应用于读多写少的场景。主要思想是创建对象的时候不立即进行复制,而是先引用(借用)原有对象进行大量的读操作,只有进行到少量的写操作的时候,才进行复制操作,将原有对象复制后再写入。这样的好处是在读多写少的场景下,减少了复制操作,提高了...

2019-06-25 11:57:27 443 0

原创 谈谈Libra

6月18日下午,Facebook发布加密货币白皮书,正式推出加密货币项目Libra。我想最近一段时间,肯定大部分区块链从业者都会关注这一项目,自己也不例外,在此,简单的谈一下Libra。 白皮书中讲到Libra的使命是建立一套简单的、无国界的货币和为数十亿人服务的金融基础设施。这一点与比特币类似...

2019-06-24 13:03:16 871 0

原创 代码统计工具cloc

有时候我们需要统计一下代码量,这时候就需要代码统计工具,推荐cloc。 安装如下: npm install -g cloc # https://www.npmjs.com/package/cloc sudo apt-get install cloc...

2019-06-21 13:16:51 992 0

原创 工作窃取算法(work-stealing)

工作中,我们经常会用到线程池,通常是任务产生后放到一个任务队列,线程池中的线程不断从任务队列中取任务执行,但这样设计在一些情况下并不是最优的,更常见的实现是基于work-stealing的线程池。work-stealing从字面理解即工作窃取,工作窃取(work-stealing)算法是指某个线程...

2019-06-20 19:16:41 990 0

原创 顺序锁

顺序锁与读写自旋锁非常类似,只是赋予了写者较高的优先级:即使在读者正在读的时候也允许写者继续运行。这样的好处是写者不用等待(除非另一个写者正在写),缺点是有些时候读者不得不反复多次读相同的数据直到它获得有效的副本。 每个顺序锁就是包括两个字段的seqlock_t结构:一个类型为spinlock_t...

2019-06-17 19:14:59 222 0

原创 区块链技术基础

区块链可以理解为是基于区块链技术形成的公共数据库。而区块链技术是比特币的底层技术,包含现代密码学、分布式一致性协议、点对点网络通信等技术,这些技术通过一定的规则协议,最终形成区块链技术......

2019-06-14 21:20:07 9031 0

原创 自旋锁

自旋锁概念 自旋锁应该是Linux内核中使用最多的锁了,其它锁很多都依赖自旋锁实现。自旋锁概念上简单,一个自旋锁是一个互斥设备,只能有2个值:“上锁"和"解锁”。它常常实现为一个整数值中的一个单个位,想获取一个特殊锁的代码测试相关的位,如果锁是可用的,这个"上锁&q...

2019-06-13 19:23:03 731 0

原创 ECDH密钥交换

前面一篇将过DH密钥交换算法,ECDH(Elliptic Curve Diffie-Hellman)顾名思义就是ECC+DH,安全性保证由椭圆曲线离散对数难题来保证。其思想与DH一致。 椭圆曲线密码学 椭圆曲线密码学是属于非对称密码学的。其公私钥计算公式如下: 私钥是一个随机数ddd,取...

2019-05-31 13:23:57 996 0

原创 Diffie-Hellman密钥交换

DH密钥交换是一种安全协议,它可以让双方在不安全的信道上创建一个密钥。双方互相发送的数据就算被第三方知晓,也无法知道加密信息的密钥。 其解决问题的主要思想可以用下图来解释: Alice和Bob想要协商出一个只有它们两人知道的颜色,不能让第三方知道,怎么办呢?解决办法如下: 先从它们共...

2019-05-30 11:56:26 593 0

提示
确定要删除当前文章?
取消 删除