热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

区块链中密码学与安全技术

区块链的定义区块链的定义,应当是:区块链是一种按照时间顺序将数据进行分布式存储的块链式数据结构,它利用共识机制进行数据验证,

区块链的定义


  • 区块链的定义,应当是:区块链是一种按照时间顺序将数据进行分布式存储的块链式数据结构,它利用共识机制进行数据验证,利用密码学进行数据保护和用户安全访问,利用智能合约来操作数据,从而成为不可篡改和不可伪造的分布式账本。所以,分布式存储、共识机制、密码学原理和智能合约构成区块链的核心技术内容。

区块链和密码学之间的关系


  • 区块链和密码学是相互促进发展的一个过程,区块链中大量使用了密码学的知识;同样的,为了满足区块链的不同场景,也反向促进了密码学的进一步发展。

引言


  • 本篇会讲述密码学在区块链中的具体的使用,从而理解为什么区块链可以防止消息被篡改、怎么进行数字身份认证。比特币中是如何通过多重签名实现多个人共同管理某个账户的比特币交易。


密码学分类


  • 古典密码学主要关注信息的保密书写和传递,以及与其相对应的破译方法。
  • 现代密码学不只关注信息保密问题,还同时涉及信息完整性验证(消息验证码)、信息发布的不可抵赖性(数字签名)、以及在分布式计算中产生的来源于内部和外部的攻击的所有信息安全问题。总而言之,现代密码学是互联网安全的基石。

密码学知识


Hash函数


  • 在有限合理的时间内,将任意长度的消息压缩为固定长度的输出值,并且是不可逆的。其输出值称为哈希值,也称为散列值。
  • Hash函数常用于实现数据完整性和实体认证,同时也构成多种密码体制和协议的安全保障

哈希函数的评价标准


  • 正向快速:给定明文和Hash算法,在有限时间和有限资源内能计算得到Hash值;
  • 逆向困难:给定(若干)Hash值,在有限时间内很难(基本不可能)逆推出明文;
  • 输入敏感:原始输入信息发生任何改变,新产生的Hash值都应该出现很大不同;
  • 冲突避免:很难找到两段内容不同的明文,使得它们的Hash值一致(发生碰撞)。

例子


  • 如果对于先前的输入做一点点的更改,输出的结果也会发生变化


碰撞


  • 碰撞是指两个不同的消息在同一个哈希函数作用下,具有相同的哈希值。哈希函数的安全性是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。
  • 冲突避免有时候又称为“抗碰撞性”,分为“弱抗碰撞性”和“强抗碰撞性”。
  • 如果给定明文前提下,无法找到与之碰撞的其他明文,则算法具有“弱抗碰撞性”;
  • 如果无法找到任意两个发生Hash碰撞的明文,则称算法具有“强抗碰撞性”。

哈希函数的种类


  • 目前常见的Hash算法包括MD和SHA系列算法。具体分类如下:


MD4(RFC 1320)是MIT的Ronald L.Rivest在1990年设计的,MD是Message Digest的缩写。其输出为128位。MD4已被证明不够安全

MD5(RFC 1321)是Rivest于1991年对MD4的改进版本。它对输入仍以512位进行分组,其输出是128位。MD5比MD4更加安全,但过程更加复杂,计算速度要慢一点。MD5已被证明不具备“强抗碰撞性”

SHA(Secure Hash Algorithm)并非一个算法,而是一个Hash函数族。NIST(National Institute of Standards and Technology)于1993年发布其首个实现。

目前知名的SHA-1算法在1995年面世,它的输出为长度160位的Hash值,抗穷举性更好。SHA-1设计时模仿了MD4算法,采用了类似原理。SHA-1已被证明不具备“强抗碰撞性”。

NIST还设计出了SHA-224、SHA-256、SHA-384和SHA-512算法(统称为SHA-2),跟SHA-1算法原理类似。

SHA-3相关算法也已被提出.

  • 目前,MD5和SHA1已经被破解,一般推荐至少使用SHA2-256或更安全的算法。

Hash函数在区块链中的应用


  • SHA256和RIPEMD160
  • RIPEMD160主要用于生成比特币地址。
  • SHA256是构造区块链所用的主要密码哈希函数。
  • HyperLedger-Fabric区块链平台中,Hash函数主要用于检测数据未经授权的修改,签名者的身份识别和抗抵赖。

加密解密算法


  • 加解密算法是密码学的核心技术。

分类


组成


  • 现代加解密系统的典型组件一般包括:加解密算法加密密钥解密密钥
  • 在加解密系统中,加解密算法自身是固定不变的,并且一般是公开可见的;密钥则是最关键的信息,需要安全地保存起来,甚至通过特殊硬件进行保护。
  • 一般来说,对同一种算法,密钥需要按照特定算法每次加密前随机生成,长度越长,则加密强度越大。加解密的基本过程如下图所示:


  • 加密过程中,通过加密算法和加密密钥,对明文进行加密,获得密文。
  • 解密过程中,通过解密算法和解密密钥,对密文进行解密,获得明文。
  • 根据加解密过程中所使用的密钥是否相同,算法可以分为对称加密(symmetric cryptography,又称公共密钥加密,common-key cryptography)和非对称加密(asymmetric cryptography,又称公钥加密,public-key cryptography)。两种模式适用于不同的需求,恰好形成互补。某些时候可以组合使用,形成混合加密机制,比如数字信封。

安全技术


消息认证码与数字签名


  • 消息认证码和数字签名技术通过对消息的摘要进行加密,可用于消息防篡改和身份证明问题。

关于消息验证码


  • 消息认证码全称是“基于Hash的消息认证码”(Hash-based Message Authentication Code,HMAC)。

消息验证码基于对称加密,可以用于对消息完整性(integrity)进行保护。

基本过程为:对某个消息利用提前共享的对称密钥和Hash算法进行加密处理,得到HMAC值。该HMAC值持有方可以证明自己拥有共享的对称密钥,并且也可以利用HMAC确保消息内容未被篡改。

一般用于证明身份的场景
如Alice、Bob提前共享和HMCA的密钥和Hash算法,Alice需要知晓对方是否为Bob,可发送随机消息给Bob。Bob收到消息后进行计算,把消息HMAC值返回给Alice,Alice通过检验收到HMAC值的正确性可以知晓对方是否是Bob。注意这里并没有考虑中间人攻击的情况,假定信道是安全的。

关于数字签名


  • 数字签名基于非对称加密,既可以用于证实某数字内容的完整性,又同时可以确认来源(或不可抵赖,Non-Repudiation)。

数字签名的全过程分两大部分,即签名验证。一侧为签名,一侧为验证过程。

签名过程:发方将原文用哈希算法求得数字摘要,用签名私钥对数字摘要加密得数字签名,发方将原文与数字签名一起发送给接受方。

(Q: 为什么要将原文进行数字摘要之后,利用私钥和摘要,对原文进行签名,而不是直接用对原文进行签名?
A:原因有二:
一是因为非对称加密算法的加密速度,远小于对称加密速度。直接对原文进行签名,消耗较大;而是因为非对称加密,对加密信息的长度,有着严格的要求,只能用于少量数据的加密。比如,RSA加密算法,要求加密的数据不得大于53个字节。
)

验证过程: 收方验证签名,即用发方公钥解密数字签名,得出数字摘要;收方将原文采用同样哈希算法又得一新的数字摘要,将两个数字摘要进行比较,如果二者匹配,说明经数字签名的电子文件传输成功。

用于防止消息篡改的场景
Alice通过信道发给Bob一个文件(一份信息),Bob如何获知所收到的文件即为Alice发出的原始版本?
Alice可以先对文件内容进行摘要,然后用自己的私钥对摘要进行加密(签名),之后同时将文件和签名都发给Bob。
Bob收到文件和签名后,用Alice的公钥来解密签名,得到数字摘要,与收到文件进行摘要后的结果进行比对。
如果一致,说明该文件确实是Alice发过来的(别人无法拥有Alice的私钥),并且文件内容没有被修改过(摘要结果一致)

数字签名的目的


  • 数字签名可以证实某数字内容的完整性和确认其来源,也就是不可抵赖性。理论上所有的非对称加密算法都可以用来实现数字签名,常用算法包括 DSA(Digital Signature Algorithm,基于 ElGamal 算法)和 ECSDA(Elliptic Curve Digital Signature Algorithm,基于椭圆曲线算法)等。

数字签名与消息验证码的区别


  • 消息验证码是基于对称加密,可以用于对消息完整性(integrity)进行保护。通信双方需要提前共享的对称密钥和Hash算法。
  • 数字签名是基于非对称加密,MAC不仅能够保证完整性,还能够保证真实性。双方不需要共享密钥,私钥仅仅需要被一方掌握。

特殊的数字签名算法


盲签名


  • 签名者需要在无法看到原始内容的前提下对信息进行签名。实现对所签名内容的保护,防止签名者看到原始内容;同时实现防止追踪,签名者无法将签名内容和签名结果进行对应。

多重签名


  • 当 x 个签名者中,收集到至少 y 个(x >= y >= 1)的签名,即认为合法。x 是提供的公钥个数,y 是需要匹配公钥的最少的签名个数。它可以有效地被应用在多人投票共同决策的场景中。比特币交易中就支持多重签名,可以实现多个人共同管理某个账户的比特币交易。

群签名


  • 群组内某一个成员可以代表群组进行匿名签名。签名可以验证来自于该群组,却无法准确追踪到签名的是哪个成员。同样存在一些问题,就是群签名需要存在一个群管理员来添加新的群成员,因此存在群管理员可能追踪到签名成员身份的风险。

环签名


  • 签名者首先选定一个包括签名者自身的临时签名者集合。用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的其他成员可能并不知道自己被包含在最终的签名中。环签名的主要用途在保护匿名性,属于一种简化的群签名。

数字证书


  • 解决的问题:公钥可能被篡改的危机
  • 对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发
  • 理论上任何人可以公开获取到对方的公钥。然而这个公钥有没有可能是伪造的呢?传输过程中有没有可能被篡改掉呢?一旦公钥自身出了问题,则整个建立在其上的安全体系的安全性将不复存在。数字证书机制正是为了解决这个问题,它就像日常生活中的一个证书一样,可以证明所记录信息的合法性。
  • 比如证明某个公钥是某个实体(如组织或个人)的,并且确保一旦内容被篡改,就能被探测出来,从而实现对用户公钥的安全分发。

分类


  • 加密数字证书:用于保护用于加密信息的公钥。
  • 签名验证数字证书:进行解密签名进行身份验证的公钥
  • 两种类型的公钥也可以同时放在同一证书中。同时证书需要由证书认证机构CA来进行签发和背书。权威的商业证书认证机构包括 DigiCert、GlobalSign等。用户也可以自行搭建CA 系统,在私有网络中进行使用。
  • 证书作为公钥信任的基础。怎么用证书来实现公钥的安全分发呢?在HyperLedger-Fabric中,使用的是PKI体系来保证的。
  • 一个数字证书内容可能包括证书域(证书的版本、序列号、签名算法类型、签发者信息、有效期、被签发主体、签发的公开密钥)、CA 对证书的签名算法和签名值等。证书的颁发者还需要对证书内容利用自己的私钥进行签名,以防止他人篡改证书内容。

PKI体系


  • 在非对称加密中,公钥可以通过证书机制来进行保护,但证书的生成、分发、撤销等过程并没有在X.509规范中进行定义。在实际工程中,安全地管理和分发证书可以遵循PKI(Public Key Infrastructure)体系来完成。PKI体系核心解决的是证书生命周期相关的认证和管理问题,在现代密码学应用领域处于十分基础和重要的地位。在HyperLedger-Fabric区块链系统中,就是用PKI体系来对证书进行管理的。

  • PKI的全称是Public Key Infrastructure公钥基础设施,是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架。包含3个核心组件:

  1. CA:全称Certification Authority,负责证书的颁发和吊销,接收来自 RA 的请求。
  2. RA:全称Registration Authority,对用户身份进行验证,校验数据合法性,负责登记,审核过了就发给 CA;
  3. 证书数据库:存放证书,多采用 X.500 系列标准格式。可以配合LDAP 目录服务管理用户信息。

  • CA 是最核心的组件,负责完成对证书信息的维护。通常的操作流程为:
  • 用户通过 RA 登记申请证书,提供身份和认证信息等 → CA 审核后完成证书的制造,颁发给用户 → 用户如果需要撤销证书则需要再次向 CA 发出申请。

证书的签发


  • CA对用户签发证书实际上是对某个用户公钥,使用CA的私钥对其进行签名。这样任何人都可以用CA的公钥对该证书进行合法性验证。验证成功则认可该证书中所提供的用户公钥内容,实现用户公钥的安全分发。
  • 用户证书的签发可以有两种方式

1,一种是由CA直接来生成证书(内含公钥)和对应的私钥发给用户;
2,另一种是由用户自己生成公钥和私钥,然后由CA来对公钥内容进行签名。

  • 后者情况下,用户一般会首先自行生成一个私钥和证书申请文件(Certificate Signing Request,即csr文件),该文件中包括了用户对应的公钥和一些基本信息,如通用名(common name,即cn)、组织信息、地理位置等。
  • CA只需要对证书请求文件进行签名,生成证书文件,颁发给用户即可。整个过程中,用户可以保持私钥信息的私密性,不会被其他方获知(包括CA方)。

证书的撤销


  • 证书超出有效期后会作废,用户也可以主动向CA申请撤销某证书文件。
  • 由于CA无法强制收回已经颁发出去的数字证书,因此为了实现证书的作废,往往还需要维护一个撤销证书列表(Certificate Revocation List,CRL),用于记录已经撤销的证书序号。
  • 因此,通常情况下,当第三方对某个证书进行验证时,需要首先检查该证书是否在撤销列表中。如果存在,则该证书无法通过验证。如果不在,则继续进行后续的证书验证过程。

 


Merkle树结构 


  • Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。在区块链系统出现之前,广泛用于文件系统和P2P系统中。其基本结构如下图所示 


  • 其主要特点为:

· 最下面的叶节点包含存储数据或其哈希值;
· 非叶子节点(包括中间节点和根节点)都是它的两个孩子节点内容的哈希值。

  • 进一步地,默克尔树可以推广到多叉树的情形,此时非叶子节点的内容为它所有的孩子节点内容的哈希值。
  • 默克尔树逐层记录哈希值的特点,让它具有了一些独特的性质。例如,底层数据的任何变动,都会传递到其父节点,一层层沿着路径一直到树根。这意味树根的值实际上代表了对底层所有数据的“数字摘要”。

Merkle树应用场景

1.快速比较大量数据


  • 对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着两组数据必然相同。否则,必然存在不同。由于Hash计算的过程可以十分快速,预处理可以在短时间内完成。利用默克尔树结构能带来巨大的比较性能优势。

2.快速定位修改


  • 例如上图Merkle树结构图中。如果D1中数据被修改,会影响到N1、N4和Root。因此,一旦发现某个节点如Root的数值发生变化,沿着Root→N4→N1,最多通过O(lgn)时间即可快速定位到实际发生改变的数据块D1。

 


布隆过滤器


  • 布隆过滤器是一种基于 Hash 的高效查找结构,能够快速判断某个元素是否在一个集合内
  • 首先回顾一下基于Hash的快速查找,由于Hash算法具有一一对应的特点,即一个内容对应一个Hash值,而Hash值最终是可以转化为二进制编码,这就天然的构成了一个 “ 内容 - 索引 ” 的一个结构。
  • 假如给定一个内容和存储数组,通过构造Hash函数,使Hash值总量不超过数组的大小,就可以实现快速的基于内容的查找。如 “孤独寂寞冷” 的 Hash 值如果是 “1000”,则存放到数组的第 1000 个单元上去。如果需要快速查找任意内容,如 “孤独寂寞冷” 字符串是否在存储系统中,只需要计算 Hash 值,并用 Hash 值查看系统中对应元素即可。
  • 布隆过滤器采用了多个 Hash 函数来提高空间利用率对同一个给定输入来说,多个 Hash 函数计算出多个地址,分别在对应的这些地址上标记为 1。进行查找时,进行同样的计算过程,并查看对应元素,如果都为 1,则说明较大概率是存在该输入。
  • 布隆过滤器相对单个 Hash 算法查找,大大提高了空间利用率,可以使用较少的空间来表示较大集合的存在关系。上面讲的Hash查找和布隆过滤器,基本思想都是基于内容的编址。
  • 下图是一个布隆过滤器的示意图


  • 布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k:
  • 以上图为例,具体的操作流程:

假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。
对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。

查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。

可以从图中可以看到:假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,这是误判率存在的原因。

  • 布隆过滤器因为其高效性大量应用于网络和安全领域,例如信息检索(BigTable和HBase)、垃圾邮件规则、注册管理等。

同态加密


介绍


  • 同态加密是一种加密形式,它允许人们对密文进行特定的代数运算得到仍然是加密的结果,将运算后的数据进行解密,其解密所得到的结果与对明文进行同样的运算结果一样
  • 传统的加密方案关注的都是数据存储安全。即,发送者要给接收者发送加密的东西,需要对数据进行加密后再发送。没有密钥的接收者,不可能从加密结果中得到有关原始数据的任何信息。只有拥有密钥的接收者才能够正确解密,得到原始的内容。需要注意到,这个过程中,用户是不能对加密结果做任何操作的,只能进行存储、传输对加密结果做任何操作,都将会导致错误的解密,甚至解密失败!
  • 同态加密提供了一种加密数据进行处理的功能。也就是说,其他人可以对加密数据进行处理,但是处理过程不会泄露任何原始内容。同时,拥有密钥的用户对处理过的数据进行解密后,得到的正好是处理后的结果。
  • 区块链中的应用:使用同态加密技术,运行在区块链上的智能合约可以处理密文,而无法获知真实数据,极大的提高了隐私安全性。

例子


A和B两个用户。A需要把自己的数据给B处理。
有两种方式:
方式一:A把自己的数据进行加密,发送给B。B将数据解密后,对数据进行处理,然后得到目标结果Result。最后把处理后的结果发送给A。
方式二: A把自己的数据进行加密,发送给B。B直接对加密的数据,进行处理,然后得到处理的结果Result*.A收到Result*之后,通过私钥解密Result*,最终得到Result。

方式二用到的方法,就是同态加密
在方式二的方式中,B完成了对A数据的处理目的,并且保证了A用户的隐私!

补充


  • 什么是同态呢?它来自代数领域,包括四种类型:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是代数同态,即全同态。同时满足四种同态性,则被称为算数同态。
  • 在计算机中如果实现了全同态意味着对于所有处理都可以实现同态性。只能实现部分特定操作的同态性,被称为特定同态。

意义


  • 换言之,这项技术令人们可以在加密的数据中进行诸如检索、比较等操作,得出正确的结果,而在整个处理过程中无需对数据进行解密。其意义在于,真正从根本上解决将数据及其操作委托给第三方时的保密问题,例如云计算。

问题


  • 虽然同态加密的优势很明显,并且已经实现,但是存在的问题就是需要较高的计算时间或存储成本,相比传统加密算法的性能和强度还有差距。困难与机会同在


参考链接


  • 密码学在区块链中的应用
  • 区块链中的密码学与安全技术

 


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
ghost
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有