Distributed Hash Tables(DHT)

分布式哈希表是一个分布式的键值对存储结构。在IPFS网络中,每一个节点都维护一个DHT的子集。当节点接受到一个请求。该节点要么直接回复,要么通过节点间传输直到找到可以回复该请求的节点。取决于实现方式,一个请求如果不能被第一个连接的节点回复

  • 进行节点间的转发,由最后一个节点联系收到请求的节点。
  • 进行节点间的转发,回复结果按照相同的路径转发回到原节点。
  • 由最优选择的节点对请求进行回复。

IPFS使用这种策略。
DHT的去中心化提供了相比于传统的键值对存储更好的优势。包括:

  • 扩展性。对长度为n的哈希请求只需要最多为log2n步即可解决。
  • 通过冗余进行错误容忍。即可能每一个节点都加入或离开DHT。另外,如果一个节点反应缓慢或者不可达,请求可以连接到其他节点。
  • 负载均衡,请求可以发送到任何节点,没有任何一个节点处理所有的请求。

DHT如何工作

Peer IDs

每一个节点有有一个peerID,和DHT的键相同都是长度为n的哈希值。

Buckets

由每一个节点维护的DHT的子集被称为”桶“,一个桶映射的哈希值和节点ID具有相同的前缀。最多m个比特位。有2m个桶,每个桶则映射2n-m个哈希值。
例如,如果m=2^16,并且使用16进制数据,节点ID为ABCDEF12345,维护以ABCD为前缀的哈希值映射。桶内的哈希值则可能为*ABCD*38E56,*ABCD*09CBA,*ABCD*17ABB.

节点列表

节点之间保持连接到其他节点为了转发请求(当请求的哈希值不在当前节点的桶内)
如果哈希值长度为n,一个节点将保持连接n-1个列表节点。

  • 第一个列表维护第一个比特值不同的节点ID的节点。
  • 第二个列表维护前一个比特值相同,第二个比特值不同的节点ID的节点。
  • 第三个列表维护前两个比特值相同,第三个比特值不同的节点ID的节点。
  • ...

假设最高的是第m个列表,很难发现最多有m个比特值相同的节点ID的节点。“最接近”对等方的列表通常保持空白。此处的“最接近”定义为XOR距离,因此它们共享的前缀越长,它们就越接近。列表还具有最大的条目(k)-否则第一个列表将包含一半的网络,然后是网络的四分之一,依此类推。

DHT使用

当节点接受到查询请求后,如果可以在自己的桶中找到答案则回复。否则联系最接近该节点的节点(IP+port,peerID,等等)回复。收到请求的节点尅将请求发送给最接近的节点。这个过程一直到可以回复请求的节点。一个哈希值长度为n的请求最多只需要log2n步,甚至是log2mn步。

键和哈希值

在IPFS的Kademili DHT,键使用SHA256哈希。节点ID使用由IPFS使用的网络库libp2p
使用DHT查看两种类型的对象时,都由SHA256进行散列:

  • 添加到IPFS的数据的Content IDs。查找该值将给出具有该不变内容的对等方的peerID。
  • IPNS记录。查找将给出与此IPNS地址关联的最后一个Content ID,从而启用可变内容的路由。

所以,IPFS的DHT只是实现不可变与可变内容路由的一种方式.当前只是一种实现.

使用

添加一条记录

添加一个blob类型的数据到IPFS等同于广播它,由于DHT由内容路由实现。可以通过ipfs add myData自动打包数据挺添加内容ID和节点ID之间的映射到DHT。注意这里可能也被其他节点ID映射到该值,所以需要添加到列表中。如果提供的数据大于124KB,数据将会被打包成blocks,整个块将被映射。
可以通过使用ipfs.name.publish发布一个IPNS记录。

IPFS学习-分布式哈希表DHT的更多相关文章

  1. DHT(Distributed Hash Table,分布式哈希表)

    DHT(Distributed Hash Table,分布式哈希表)类似Tracker的根据种子特征码返回种子信息的网络. DHT全称叫分布式哈希表(Distributed Hash Table),是 ...

  2. 高性能分布式哈希表FastDHT

    高性能分布式哈希表FastDHT介绍及安装配置 FastDHT-高效分布式Hash系统 FastDHT(分布式hash系统)安装和与FastDFS整合实现自定义文件ID Centos6.3 停安装 F ...

  3. Leetcode Lect7 哈希表

    传统的哈希表 对于长度为n的哈希表,它的存储过程如下: 根据 key 计算出它的哈希值 h=hash(key) 假设箱子的个数为 n,那么这个键值对应该放在第 (h % n) 个箱子中 如果该箱子中已 ...

  4. 哈希表(散列)HashTable实现

    近期刷Leetcode发现凡是找字符串中反复字符或者数组中找反复数据的时候就不知道从何下手了. 所以决定学习一下哈希表解题.哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结 ...

  5. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

  6. 【编程学习】浅谈哈希表及用C语言构建哈希表!

    哈希表:通过key-value而直接进行访问的数据结构,不用经过关键值间的比较,从而省去了大量处理时间. 哈希函数:选择的最主要考虑因素--尽可能避免冲突的出现 构造哈希函数的原则是: ①函数本身便于 ...

  7. Redis原理再学习04:数据结构-哈希表hash表(dict字典)

    哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...

  8. Java学习笔记31(集合框架五:set接口、哈希表的介绍)

    set接口的特点: 1.不包含重复元素 2.set集合没有索引,只能用迭代器或增强for循环遍历 3.set的底层是map集合 方法和Collection的方法基本一样 set接口的实现类HashSe ...

  9. Perl学习笔记(3)----遍历哈希表的一个容易疏忽的地方

    今天做 Google的 Code Jam 上的一道题目:https://code.google.com/codejam/contest/351101/dashboard#s=p2,用Perl语言解答的 ...

随机推荐

  1. js如何衔接css3的多个@keyframes动画?

    css3特效动画,我们在编写页面中经常遇到,而且是在同一个div模块上有多个衔接的不同动画,css中,我们经常使用animation-delay (规定在动画开始之前的延迟)进行处理. 那么,下面分享 ...

  2. JVM虚拟机详解+Tomcat性能优化

    1.JVM(java virtual mechinal) ()JVM有完善的硬件架构,如处理器.堆栈.寄存器当,还具有相应的指令系统. ()JVM的主要工作时解释自己的指令集(即字节码),并映射到本地 ...

  3. 从零开始openGL—— 二、 基本图形绘制

    前言 这是从零开始openGL系列文章的第二篇,在上篇文章中介绍了基本的环境配置,这篇文章将介绍如何绘制基本图形(圆.三角形.立方体.圆柱.圆锥). 基本框架 下面这里我先给出opengl的3D绘图的 ...

  4. Head First设计模式——迭代器模式

    前言:迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么回事呢. 看完迭代器模式你就知道C# foreach循环是怎么实现的了,我的另一篇C# ...

  5. 基于Docker搭建分布式消息队列Kafka

    本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...

  6. 充满含金量的一场云原生Meetup,入场券免费发送中……

    在武汉,你离这场云原生盛会,只有一步之遥 华为云.百度.斗鱼.海云基因,五位重量级专家 K8s调度.深度学习平台.斗鱼实战.基因大数据-五个干货议题 日,与您相约Cloud Native Days C ...

  7. 深入理解Android异步消息处理机制

    一.概述 Android 中的异步消息处理主要分为四个部分组成,Message.Hndler.MessageQueue 和 Looper.其关系如下图所示: 1. Message 是线程之间传递的消息 ...

  8. UITableView 实例详解 滑动编辑 headerView

    转自:http://blog.csdn.net/reylen/article/details/8505960 self.dataArray = [[[NSMutableArray alloc]init ...

  9. MongoDB的第二天(更新,删除,查询,索引)

    Mongodb的更新方式有三种 update函数,操作符更新,save函数 update: 语法格式:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选) ...

  10. zabbix系列-Grafana4.6.3+Zabbix 的安装部署

    zabbix系列(五) Grafana4.6.3+Zabbix 的安装部署 伟创享 2019-07-31 11:27:18 使用了一段时间Grafana,感觉还挺好用的.部分效果图如下: ​ zabb ...