Hash算法的分类和原理(从零开始学区块链 194)

Hash算法广泛应用于区块链工作量证明中,每个具有创新性的区块链项目中均有各自不同的实现,属于区块链中比较核心和基础的技术,以前也有篇幅介绍,本文主要介绍Hash算法中的相关原理,便于更深入理解这项技术


Hash算法在信息安全方面的应用主要体现在三个方面:


(1) 文件校验

我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检測并纠正传输数据中的信道误码,但却不能防止对数据的恶意破坏。

MD5 Hash算法的”数字指纹”特性,使它成为眼下应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。


(2) 数字签名

Hash 算法也是现代password体系中的一个重要组成部分。因为非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称”数字摘要”进行数字签名,在统计上能够觉得与对文件本身进行数字签名是等效的。并且这种协议还有其它的长处。


(3) 鉴权协议

例如以下的鉴权协议又被称作挑战–认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。


Hash算法分类


一般的说,Hash算法函数根据其原理,能够简单的划分为例如以下几类:

1. 加法Hash;
2. 位运算Hash;
3. 乘法Hash;
4. 除法Hash;
5. 查表Hash;
6. 混合Hash;

以下具体的介绍以上各种方式在实际中的运用。


1、加法Hash

所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。标准的加法Hash的构造例如以下:


static int additiveHash(String key, int prime)

{

 int hash, i;

 for (hash = key.length(), i = 0; i < key.length(); i++)

  hash += key.charAt(i);

 return (hash % prime);

}


这里的prime是随意的质数,看得出,结果的值域为[0,prime-1]。


2、位运算Hash

这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素。比方,标准的旋转Hash的构造例如以下:

static int rotatingHash(String key, int prime)

{

 int hash, i;

 for (hash=key.length(), i=0; i

   hash = (hash<>28)^key.charAt(i);

 return (hash % prime);

}


先移位,然后再进行各种位运算是这样的类型Hash函数的主要特点。

3、乘法Hash


这样的类型的Hash函数利用了乘法的不相关性(乘法的这样的性质,最有名的莫过于平方取头尾的随机数生成算法,尽管这样的算法效果并不好)。例如:


static int bernstein(String key)

{

 int hash = 0;

 int i;

 for (i=0; i

 return hash;

}


使用这样的方式的著名Hash函数还有FNV算法及其变种,需要注意的是ETH中的EThash算法中就部分采用FNV代替常见的异或操作:


// 32位FNV算法

int M_SHIFT = 0;

  public int FNVHash(byte[] data)

{

      int hash = (int)2166136261L;

      for(byte b : data)

          hash = (hash * 16777619) ^ b;

      if (M_SHIFT == 0)

          return hash;

      return (hash ^ (hash >> M_SHIFT)) & M_MASK;

}


以及改进的FNV算法:

public static int FNVHash1(String data)

{

      final int p = 16777619;

      int hash = (int)2166136261L;

      for(int i=0;i

          hash = (hash ^ data.charAt(i)) * p;

      hash += hash << 13;

      hash ^= hash >> 7;

      hash += hash << 3;

      hash ^= hash >> 17;

      hash += hash << 5;

      return hash;

}


除了乘以一个固定的数,常见的还有乘以一个不断改变的数,比方:

static int RSHash(String str)

{

      int b    = 378551;

      int a    = 63689;

      int hash = 0;

     for(int i = 0; i < str.length(); i++)

{

        hash = hash * a + str.charAt(i);

        a    = a * b;

}

     return (hash & 0x7FFFFFFF);

}


另外,尽管Adler32算法的应用没有CRC32广泛,只是,它可能是乘法Hash里面最有名的一个了。关于它的介绍,大家能够去看RFC 1950规范。


4、除法Hash

除法和乘法一样,相同具有表面上看起来的不相关性。只是,由于除法太慢,这样的方式差点儿找不到真正的应用。须要注意的是,我们在前面看到的hash的 结果除以一个prime的目的仅仅是为了保证结果的范围。假设你不须要它限制一个范围的话,能够使用例如以下的代码替代”hash%prime”: hash = hash ^ (hash>>10) ^ (hash>>20)。


5、查表Hash

查表Hash最有名的样例莫过于CRC系列算法。尽管CRC系列算法本身并非查表,但是,查表是它的一种最快的实现方式。


查表Hash中有名的样例有:Universal Hashing和Zobrist Hashing。他们的表格都是随机生成的。


6、 混合Hash

混合Hash算法利用了以上各种方式。各种常见的Hash算法,比方MD5、Tiger都属于这个范围。它们一般非常少在面向查找的Hash函数里面使用。


当然根据你的需要选择合适的hash函数是非常需要技巧的,最简单可以使用主要的乘法Hash,当乘数为33时,对于英文单词有非常好的散列效果(小于6个的小写形式能够保证没有冲突)。复杂一点能够使用FNV算法(及其改进形式),它对于比較长的字符串,在速度和效果上都不错。



关于本文

这些分类里面FNV非常值得关注,毕竟EThash采用了,喜欢就关注吧,您也可以转发到群和朋友圈中让更多人了解,您的支持和鼓励是我最大的动力


长按关注,学习更多


相关内容阅读

scrypt算法的前世今生(从零开始学区块链 192)

一致性hash算法详解(从零开始学区块链 57)

Quorum(NRW)算法机制简介(从零开始学区块链 141)

Chord算法详解(从零开始学区块链 93)

IT世界的10大算法(从零开始学区块链 77)

深度说一下RSA算法(从零开始学区块链 61)

聊聊离散对数加密算法(从零开始学区块链 62)

简约而不简单的随机数(从零开始学区块链 51)

面对Grover量子算法区块链安全吗(从零开始学区块链 49)


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Python和SHA-256哈希算法实现一个简单的区块链系统的代码: ```python import hashlib import datetime class Block: def __init__(self, data, previous_hash): self.timestamp = datetime.datetime.now() self.data = data self.previous_hash = previous_hash self.hash = self.calculate_hash() def calculate_hash(self): block_contents = str(self.timestamp) + str(self.data) + str(self.previous_hash) block_hash = hashlib.sha256(block_contents.encode()).hexdigest() return block_hash class Blockchain: def __init__(self): self.chain = [self.create_genesis_block()] def create_genesis_block(self): return Block("Genesis Block", "0") def add_block(self, data): previous_hash = self.chain[-1].hash new_block = Block(data, previous_hash) self.chain.append(new_block) def is_valid(self): for i in range(1, len(self.chain)): current_block = self.chain[i] previous_block = self.chain[i-1] if current_block.hash != current_block.calculate_hash(): return False if current_block.previous_hash != previous_block.hash: return False return True ``` 上面的代码定义了一个`Block`类和一个`Blockchain`类。`Block`类用于表示区块,包含数据、时间戳、前一个区块的哈希值和当前区块的哈希值。`Blockchain`类用于管理区块链,包含一个区块链列表和添加区块、验证区块链等方法。 现在,我们可以创建一个区块链实例并添加一些区块: ```python blockchain = Blockchain() blockchain.add_block("This is block 1") blockchain.add_block("This is block 2") blockchain.add_block("This is block 3") ``` 每个区块的哈希值都是通过SHA-256哈希算法计算得出的,可以通过调用`calculate_hash()`方法来计算。验证区块链是否有效可以调用`is_valid()`方法,它会检查每个区块的哈希值和前一个区块的哈希值是否匹配。 ```python print("Blockchain is valid:", blockchain.is_valid()) ``` 输出: ``` Blockchain is valid: True ``` 现在,我们可以尝试篡改区块链,看看是否能够成功: ```python blockchain.chain[1].data = "This is block 1 - modified" ``` 这里将第二个区块的数据修改了一下。再次验证区块链是否有效: ```python print("Blockchain is valid:", blockchain.is_valid()) ``` 输出: ``` Blockchain is valid: False ``` 可以看到,现在区块链已经失效了,因为第二个区块的哈希值已经发生了改变。 这就是使用Python和SHA-256哈希算法实现一个简单的区块链系统的方法。当然,这只是一个简单的示例,实际的区块链系统还需要进行更多的优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值