加入收藏 | 设为首页 | 会员中心 | 我要投稿 阳江站长网 (https://www.0662zz.cn/)- 办公协同、云通信、区块链、物联平台、高性能计算!
当前位置: 首页 > 站长资讯 > 动态 > 正文

聚焦三有渠道,践行两大计划

发布时间:2021-02-21 12:05:46 所属栏目:动态 来源:互联网
导读:传统的网络结构是client-server的模式,所有的client都是和server交互获取信息, 只要server挂掉了,client也就没有用了。 而在P2P网络中,没有server的概念,每个节点可以作为一个server。对比起来P2P网络在稳定性方面要比C-S架构的系统要稳定得多。 网络发

传统的网络结构是client-server的模式,所有的client都是和server交互获取信息, 只要server挂掉了,client也就没有用了。

而在P2P网络中,没有server的概念,每个节点可以作为一个server。对比起来P2P网络在稳定性方面要比C-S架构的系统要稳定得多。

网络发现与同步

既然是P2P网络,那么问题来了,这个P2P网络是怎么建立起来的呢?节点之间是怎么发现的呢?

有做过P2P下载的同学应该都听说过种子的概念,这个种子里面保存了其他活跃的节点的地址。通过下载种子就可以连接对应的节点。

而每个节点又保存了最近连接或者活跃的节点,这样就形成了庞大的P2P网络。

同样的,比特币的P2P网络也是这样的。

新节点是如何发现网络中的对等节点的呢?虽然比特币网络中没有特殊节点,但是客户端会维持一个列表,那里列出了那些长期稳定运行的节点。这样的节点被称为“种子节点(seed nodes)”

节点必须持续进行两项工作:在失去已有连接时发现新节点,并在其他节点启动时为其提供帮助。

SPV节点

我们之前介绍了,在比特币的世界里既没有账户,也没有余额,只有分散到区块链里的UTXO(Unspent Transaction Outputs)。

那么如果想要验证交易的话,需要从历史的交易中查找所有的和该交易有关的交易,从而进行完整,全面的验证。

这样做的问题就是,如果下载所有的历史记录,那么需要上百G的硬盘空间,这对于手机或者其他轻量级的客户端是无法想象的。

于是SPV出现了。SPV的全称是Simplified payment verification,叫做简单认证支付。

SPV保存的不是整个区块链,而是区块链的头部,因为每个区块链头只有80字节,所以即使把所有的区块头都下载保存起来也不会很大。

区块链头

区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。

第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关。

第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构)。

Nonce、难度目标和时间戳会用于挖矿过程,Merkle根用来索引和组织该区块所有的交易信息。



 

hashCode 相等时,equals 一定相等吗?

很显然不是的。在 HashMap 的源码中,我们就能看到,当 hashCode 相等时(产生哈希碰撞),还需要比较它们的 equals ,才可以确定是否是同一个对象。因此,hashCode 相等时, equals 不一定相等 。

反过来,equals 相等的话, hashCode 一定相等吗?那必须的。equals 都相等了,那说明在 HashMap 中认为它们是同一个元素,所以 hashCode 值必须也要保证相等。

结论:

  • hashCode 相等,equals 不一定相等。
  • hashCode 不等,equals 一定不等。
  • equals 相等, hashCode 一定相等。
  • equals 不等, hashCode 不一定不等。

关于最后这一点,就是 hashCode 源码注释中提到的第三点。当 equals 不等时,不用必须保证它们的 hashCode 也不相等。但是为了提高哈希表的效率,最好设计成不等。

因为,我们既然知道它们不相等了,那么当 hashCode 设计成不等时。只要比较 hashCode 不相等,我们就可以直接返回 null,而不必再去比较 equals 了。这样,就减少了比较的次数,无疑提高了效率。

结尾

以上就是 hashCode 和 equals 相关的一些问题。相信已经可以解答你心中的疑惑了,也可以和面试官侃侃而谈。再也不用担心,面试官说换人了。



(编辑:阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读