哪个分布式哈希表(DHT)最容易在Python中实现?任何不臃肿的好例子?
我不是在寻找DHT的定义,因为我更倾向于并专注于设计和实现这样的.
我有一个相当奇怪的问题.对于分布式哈希表,我需要能够对MD5哈希进行一些简单的数学运算.这些包括总和(由散列表示的数字和)和模运算.现在我想知道实现这些操作的最佳方法是什么.我正在使用hashlib来计算哈希值,但是因为我得到的哈希值就是字符串,我该怎么用它们计算?
我正在寻找有关Java 中的分布式哈希表的简单开源实现的建议.没有花哨的功能,仅用于学习目的,不需要生产功能.设置起来应该很简单(例如,1台带有n-JVM的物理机器),并且最好通过一些示例,教程或启动指南进行详细记录.
研究产生了这些候选人:FreePastry和OpenChord,但我并不完全相信他们符合我的简单明智标准.
您对这些或其他实施有经验吗?建议?
谢谢和adios
我试图理解DHT协议如何工作,特别是在文件共享洪流世界.我阅读了很多文章,但我仍然与文件名值哈希生成混淆.
我的dht如何工作如下:让我说我加入了一个p2p网络,我想分享一些文件.对于这些文件,生成散列映射密钥并通过网络"遍历",直到访问负责这些生成的密钥的节点.然后,这些节点中的每一个都在其列表中添加一条记录,该记录显示"具有x IP地址的人具有与指定密钥相关的文件.
当我搜索文件时,会为该文件生成hashmap密钥并在网络中传输,直到找到负责此密钥的节点.然后该节点与我通信并向我发送承载真实数据的节点的IP地址
我的上述情况是否正确?
我试图访问Torrent DHT网络,我很难搞清楚如何访问DHT中的"入口"节点.
描述了几个标准入口节点可以使用在端口6881(UDP)上运行的router.bittorrent.com和router.utorrent.com.AND http://www.bittorrent.org/beps/bep_0005.html描述了如何与DHT服务器交互的协议.
但是,如果我发送一个简单的UDP消息到router.utorrent.com:6881,我怎么知道哪些端口消息将被发回给我以回应我的请求?我试着在发送到6881的同一端口上收听消息,但我什么都没收到.
这些入口点是限于他们自己的客户端(uTorrent)还是任何第三方客户端都可以使用他们的"路由器"?
最近,我已经阅读了Kademlia协议的文档,我试图理解协议,但我仍然有一些问题:为什么一个节点在知道它的ID而不是ip或端口时必须找到另一个节点?为什么他不知道ip或端口时有ID,他在哪里获得ID?我认为两个不同节点之间的"距离"不是路由距离或实际距离,它只是一个虚拟距离,可以用算法快速找到节点,就是这样吗?
也许我的英语不是很清楚,因为英语不是我的母语,但如果你需要,我会尽力表达自己.非常感谢!
我使用写分散聊天应用程序nodejs,expressjs,angularjs,socket.io和ipfs.我现在用libp2p形成,将相互在一个开放的连接进行通信的节点.Libp2p是一个模块化的IPFS项目网络堆栈.
Libp2p允许我构建nodes能够托管一个swarm或listening/ dialing一个的.我已经发展到几个节点可以通过angularjs(由socket.io补充)网页中的输入相互通信,但是它们的IP地址和tcp端口需要进行硬编码.
我面临的问题是,如果未知数量的用户加入此系统并设置其节点,我该如何处理该方案.我已经完成了大量的研究,DHT特别是它与种子的应用,但我没有接近实际应用它.
我不想运行一个跟踪用户的中央系统,因为跟踪器跟踪种子中的播种机和传感器(由于DHT,现在有些多余)
在集中式聊天应用程序中,每次用户进入或离开时,我都可以使用socket.io信号从服务器向所有对等体发送emit事件.但是,分散式聊天应用程序中的等价物是我正在努力奋斗的东西.
我需要一些指导.
我的理解是 IPFS 和 Bittorrent Mainline DHT 建立在分布式哈希表 (Kademlia) 之上。他们使用文件哈希作为 Kademlia 密钥来查找可能拥有此文件的对等点列表。
1- 我不明白的是,这是否都是分散的,谁从不再托管文件内容的 DHT 对等方中删除?
2- 什么阻止某人在 DHT 中免费存储大量数据?
3- 什么防止某人通过为流行文件添加大量无效对等点来破坏网络。
4- 什么阻止坏人加入 DHT 环而不遵循路由协议,从而阻止发现消息到达正确的节点。
我试图了解一致性哈希是如何工作的。这是我试图遵循但无法遵循的文章,首先我的问题是:
我明白,服务器被映射到哈希码范围内,数据分布更加固定,看起来也很容易。但是这如何处理集群中添加新节点的问题呢?
示例 java 代码不起作用,任何基于简单java的一致散列的建议。
更新
我正在为内部集群实现自己的dht.由于它将用于像bittorrent这样的文件共享程序,"Mainline DHT"是我第一眼看到的.之后我发现"纠结"(python,dht使用扭曲矩阵),国会(python,dht使用pyev + libev),当然还有原始的"kademlia".
他们在组织k-buckets时有不同的方法:
1)congress,kademlia使用固定的160个桶,范围为2*i <=(每个id与我们的差值)<2*(i + 1),0 <= i <160.
2)主线DHT和纠缠使用动态桶.一开始他们只有一个铲斗覆盖整个空间.在它将填充8个活动节点后,桶将被拆分为2个新节点.但只有我们自己的id在那个桶里面.如果不是 - 桶将永远不会分裂.所以,很快我们将有160个最接近我们的桶和其他一些.
两种变体都足够好.但是我发现逻辑上存在巨大差异,它检测到属于某个桶的某个ID.这是我的问题.
国会和kademlia将桶子对待为"离我们最近的距离"和"离我们最远的距离".因此,我们自己的ID将始终在bucket0中.bucket1中最多2个其他ID(因为它覆盖2*1 <= x <2*2距离)将始终最接近我们.所以我的大脑没有休息,因为一切都好.
但是,如果您查看Mainline DHT或纠缠,您将看到哪些存储桶包被视为绝对节点ID包,而不是xor距离!所以在理论上全表id 0,1,2,3,4,5,6,7将在1个桶中.
所以.为什么有些实现将桶边界视为"与我们的最大/最小距离",而其他实现则将"最大/最小160位整数值"?