自定义博客皮肤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

阅读数 105

评论数 0

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

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

2019-05-15 23:18:03

阅读数 199

评论数 1

原创 堆排序

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

2020-01-17 13:23:09

阅读数 22

评论数 0

原创 跳跃链表

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

2020-01-14 18:17:14

阅读数 1685

评论数 0

原创 自组织链表

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

2020-01-09 10:39:00

阅读数 106

评论数 0

原创 AES加密算法工作原理

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

2019-12-10 10:41:56

阅读数 526

评论数 3

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

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

2019-12-06 18:30:03

阅读数 111

评论数 0

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

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

2019-12-03 19:15:44

阅读数 116

评论数 0

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

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

2019-12-02 10:07:27

阅读数 27

评论数 0

原创 图的表示与遍历

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

2019-11-29 21:47:09

阅读数 92

评论数 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

阅读数 831

评论数 2

原创 2019年中总结

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

2019-07-18 18:53:24

阅读数 166

评论数 0

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

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

2019-07-15 13:41:29

阅读数 329

评论数 0

原创 比特币核心数据结构

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

2019-07-12 11:59:27

阅读数 70

评论数 0

原创 Merkle树

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

2019-07-11 15:09:08

阅读数 112

评论数 0

原创 Bloom过滤器

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

2019-07-10 13:35:41

阅读数 332

评论数 0

原创 闪电网络

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

2019-07-10 13:25:10

阅读数 716

评论数 0

原创 比特币交易

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

2019-07-09 13:32:43

阅读数 117

评论数 0

原创 哈希表原理

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

2019-07-08 18:05:07

阅读数 456

评论数 0

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

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

2019-07-03 18:51:11

阅读数 290

评论数 0

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

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

2019-06-28 09:44:58

阅读数 1898

评论数 0

原创 【Rust】写时复制Cow

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

2019-06-25 11:57:27

阅读数 185

评论数 0

原创 谈谈Libra

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

2019-06-24 13:03:16

阅读数 707

评论数 0

原创 代码统计工具cloc

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

2019-06-21 13:16:51

阅读数 609

评论数 0

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

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

2019-06-20 19:16:41

阅读数 504

评论数 0

原创 顺序锁

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

2019-06-17 19:14:59

阅读数 68

评论数 0

原创 区块链技术基础

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

2019-06-14 21:20:07

阅读数 7384

评论数 0

原创 自旋锁

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

2019-06-13 19:23:03

阅读数 587

评论数 0

原创 ECDH密钥交换

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

2019-05-31 13:23:57

阅读数 441

评论数 0

原创 Diffie-Hellman密钥交换

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

2019-05-30 11:56:26

阅读数 204

评论数 0

原创 区块链技术学习资料集

这里列出了个人认为比较重要的区块链技术的相关论文及资料,学习区块链技术还是很鼓励大家看原始论文的,虽然相对源码或市面上的书籍,可能技术的具体实现细节讲述的比较少,但是最重要的是论文中对解决问题的思路及论证阐述的比较到位。仅仅看源码可能很难理解作者为什么要这么做以及这样做为什么是对的。 看论文是个...

2019-05-24 18:56:25

阅读数 453

评论数 0

原创 对区块链技术几个问题的思考

【1】为什么POW达成共识的周期较长? 在像比特币这种公有链中,节点的数量是巨大的,而其基础P2P网络中每个节点都连接相对有限的节点,当有节点需要发送交易到全网时,其进行一次全广播是非常耗时的,当然产生新块后,全网广播也是非常耗时的。如果达成共识的时间设置的太短,对造成比特币频繁的分叉,造成系统...

2019-05-20 18:27:20

阅读数 106

评论数 0

原创 基础数论——同余式、剩余类

本文总结了基础数论中关于同余式的相关内容......

2019-04-15 22:27:18

阅读数 229

评论数 0

原创 基础数论——算数基本定理、欧几里得算法、丢番图方程

本文简述了基础数论中关于算数基本定理,欧几里得算法,扩展欧几里得爽,丢番图方程等内容......

2019-04-08 22:36:45

阅读数 275

评论数 0

翻译 以太坊RLPx传输协议

本文档定义了RLPx传输协议,一种基于TCP的用于Ethereum节点间通信的传输协议。该协议适用于任意内容的加密帧,但它通常用于承载devp2p应用程序协议......

2019-03-07 10:34:26

阅读数 151

评论数 0

原创 【TCP/IP详解】TCP保活机制

在需要长连接的网络通信程序中,经常需要心跳检测机制,来实现检测对方是否在线或者维持网络连接的需要。这一机制是在应用层实现的,对应的,在TCP协议中,也有类似的机制,就是TCP保活机制......

2019-02-14 18:16:14

阅读数 1317

评论数 0

原创 ECIES详解

本文描述了使用ECIES加解密时的详细计算步骤......

2019-01-04 12:16:26

阅读数 1797

评论数 0

原创 Elasticsearch定时删除索引

在Elasticsearch中,我们常常按时间建立索引,以便我们今后的使用与管理,同时我们也经常按时间去删除一些老的数据。比如只保留最近3天的数据,只需将超多3天的索引数据删除就好了。删除索引有很多种方法,你可以自己编写脚本删除索引,这里使用Curator删除索引。Curator是elastics...

2018-12-18 09:44:44

阅读数 1291

评论数 0

原创 【Rust】对所有权、借用及生命周期的理解

Rust的内存管理中涉及所有权、借用与生命周期这三个概念,要理解这三个概念,你首要想的是这么做的出发点是什么——内存安全,这是Rust非常强调的一点。可以这么理解,所有权、借用与生命周期很大程度上是为内存安全而设计的......

2018-11-08 09:45:43

阅读数 650

评论数 0

原创 127.0.0.1与0.0.0.0及本机IP地址的区别

127.0.0.1,特殊的环回地址,大多数系统把此IP地址分配给换回接口分配给这个接口,并命名为localhost(主机名),一般用来对运行在同一台主机上的程序通过TCP/IP进行通信。 0.0.0.0,特殊的源地址,表示的是网络上的所有主机,一般在写服务端程序绑定监听地址时常用此地址。 其实,1...

2018-10-25 17:03:26

阅读数 1086

评论数 3

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