首页 业界 正文

比特币哈希函数简述

2017-02-20 13:59:18 来源:巴比特资讯 作者:Corin Faife 阅读:8191
   
对比特币感兴趣的人或多或少应该都听说过“加密哈希函数(cryptographic hash function)”这个术语。但是它究竟是什么意思,与加密货币又有什么联系?

对比特币感兴趣的人或多或少应该都听说过“加密哈希函数(cryptographic hash function)”这个术语。但是它究竟是什么意思,与加密货币又有什么联系?

bitcoin-computer-e1487366312963

哈希函数不仅是比特币协议的重要部分,还是也是整个信息安全的重要部分。

我们将在下文中通过一些简单的例子来展示哈希函数的工作原理。

什么是哈希函数?

从理论上讲,哈希函数就是一种数学流程,将任意大小的输入数据放入该流程,然后返回固定大小的输出数据。

更具体地讲就是,提取任意长度的字母序列作为输入——我们将其称为string——然后返回一个固定长度的字母序列。无论这个输入string是一个单一的字母,单词,句子还是整部小说,而输出的长度——叫做摘要(digest)——永远都是相同的。

这种类型的哈希函数的常见用例就是存储密码。

当你使用任何一种网络服务创建一种需要密码的用户账户时。这种密码都是通过哈希函数运行的,存储的就是该密码信息的哈希摘要。当你输入密码来登录账号时,然后相同的哈希函数就会去运行你输入的密码,然后服务器就会检查其结果是否与存储的摘要相匹配。

这就意味着即使黑客能够访问用于存储哈希的数据库,他们也不可能立即破坏所有用户账户,因为无法轻易找到生成某一特定哈希的密码。

Python简单哈希函数

你可以使用Python(Mac和Linux操作系统在默认情况下安装的编程语言)来实验哈希值。(本教程假设使用了某种版本的OSX或者Linux系统,因为Windows使用Python会更加复杂)

首先,打开终端,输入python并点击Enter。

然后你将进入Python REPL,在这种环境下,你可以直接试用Python命令,而不是在单独的文件中编写程序。

然后输入以下数值,在每行之后敲击Enter,并在标记处输入TAB:

import hashlib
def hash(mystring):
[TAB] hash_object = hashlib.md5(mystring.encode())
[TAB] print(hash_object.hexdigest())
[ENTER]

这样你就创建了一个函数——hash(),该函数将计算出某一特定的使用MD5哈希算法的字符串的哈希值。将字符串插入上述的括号()中便可运行该函数。例如:

hash(“CoinDesk rocks”)

按下Enter并查看该字符串的哈希摘要。

你将看到在同一字符串上调用该哈希函数将会总是生成相同的哈希,但添加或改变其中的某一个字符将会生成一种完全不同的哈希值:

hash("CoinDesk rocks") => 7ae26e64679abd1e66cfe1e9b93a9e85
hash("CoinDesk rocks!") => 6b1f6fde5ae60b2fe1bfe50677434c88

比特币哈希函数

在比特币协议中,哈希函数是区块哈希算法的一部分,区块哈希算法可以用来通过挖矿流程将新的交易编写到区块链中。

在比特币挖矿过程中,函数的输入都是来自于最近的尚未确认的交易(以及一些与前一个区块相关的时间戳和引用一些额外输入)

在以上代码示例中,我们已经看到改变哈希函数中的一小部分会导致产生一种完全不同的输出。这个属性与挖矿过程中的“工作量证明(POW)”算法至关重要:为了成功“解决”一个区块,矿工需要以这种方式将所有输入与他们自己的输入数据结合,由此产生的哈希将以某些0开头。

作为一种基础的演示,我们可以通过在“CoinDesk rocks!”后面手动添加尝试感叹号(!),以此尝试使用我们的Python哈希函数来进行“挖矿”,知道我们找到以单个0开头的哈希。

>>> hash("CoinDesk rocks!!")
66925f1da83c54354da73d81e013974d
>>> hash("CoinDesk rocks!!!")
c8de96b4cf781a6373766c668ceac0f0
>>> hash("CoinDesk rocks!!!!")
9ea367cea6a2cc4a6f5a1d9a334d0d9e
>>> hash("CoinDesk rocks!!!!!")
b8d43387d98f035e2f0ac49740a5af38
>>> hash("CoinDesk rocks!!!!!!")
0fe46518541f4739613b9ce29ecea6b6 => SOLVED!

当然,为比特币区块解决哈希——编写该文时,必须以18个0开头——需要一个非常大的计算量(比特币网络的所有计算机处理能力结合在一起仍旧需要接近10分钟才能解决一个区块)。

需要大量的处理能力就意味着新比特币的挖掘需要一个长期的过程才能完成,而无法一次性将所有的比特币全部挖出。

为了能够从挖矿中赚取比特币,你需要投入大量的工作来解决区块——通过获得这种奖励,你将所有的新交易锁入区块中,也就是添加到之前所有交易的永久性记录中:区块链。

声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

更多 矿机信息