Hash,也可翻译成“散列”,它是一种加密算法,一种单向密码体制。即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。并且无论信息正文中的内容有多大,哈希函数总能用固定长度的数据来表述正文里的所有内容。即哈希函数是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
哈希的算法有很多种类,在比特币系统中使用的是SHA-256和RIPEMD-160算法。不过除了生成地址的其中一个环节外使用到RIPEMD-160算法外(由于RIPEMD也是哈希算法的一种,RIPEMD-160有时候也被称为哈希160),其它使用哈希运算的地方的都是用SHA-256算法。
哈希256算法提供了由数字和字母构成的长度为64的十六进制字符串,该算法有个特点,就是不管你输入的是一个词语还是一本书的内容,比如输入《红楼梦》这本巨著,最终生成的哈希值都是64个字符串。而且只要输入信息有一小点变化,比如一个空格或一个小数点,输出的哈希值都会变化。
该算法除了有输出长度固定的特点外,还有单向不可逆以及防止篡改特性,就是说如果输入A,经过哈希运算得到B,但不能够输入B而反推得到A;
另外就是输入的A中,只要有一小点改变,如一个字母或一个字节的变动,经过哈希算法得出来数值都会有改变,就不是之前的B了。
由于哈希算法得出的哈希值是固定长度,即范围有限,但输入数据却是无限的。那就存在着两个不同的A,经过哈希算法之后得到相同的B的可能性,这种情况就叫“哈希碰撞”。
比特币系统就巧妙利用这个“哈希碰撞”,让矿工们用穷举法不断去运算出哈希值,即工作量证明方式去碰撞出正确答案的哈希值,谁第一个碰撞出来谁就获得比特币奖励,故此挖矿的算力实际指的是每秒钟多少次哈希碰撞。
下面举例说明:
假设现在有交易数据C、D、E,随机数用Nonce表示,难度要求是哈希值必须是000开头,那么系统里计算的哈希值如下:
Ha1= Hash(C+Nonce1)
Ha2= Hash(D+ Ha1+Nonce2)
Ha3= Hash(E+ Ha2+Nonce3)
同时要求Ha1、Ha2、Ha3都是000开头。在这种情况下由于哈希值不能逆推,而C、D、E的数值已经确定,那就只能不断地去试随机数Nonce,直到找到满足Ha1、Ha2、Ha3都是000开头的数值,这个试的过程就形象称之为挖矿。