1. Hash 的概念
~~~~~~~ Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的 输入 (又叫做预映射pre-image)通过散列算法变换成固定长度的 输出 ,该输出就是散列值。 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。(逆推是不行的啦就是说)
2. Hash 的特点
-
唯一性:对于任何给定的输入,哈希算法都能够生成唯一的哈希值。如果输入有所更改,即使只是改动了一个比特位,其哈希值也会发生明显的变化。
-
固定性:哈希算法将任意长度的输入映射为固定长度的哈希值,因此生成的哈希值的长度是固定的。例如,SHA-256算法生成的哈希值的长度总是256位。
-
不可逆性:哈希算法是一种单向函数,无法从哈希值推导出原始输入。因此,哈希算法可以用于存储密码,以保护用户密码不被泄露。
-
确定性:给定相同的输入,哈希算法总是能够生成相同的哈希值。这使得哈希算法可以用于数据完整性验证和数字签名等应用场景。
-
散列性:哈希算法的输出值看起来是随机的,而且将相似的输入映射为截然不同的哈希值,即使只有一点微小的变化。这种特性使哈希算法在散列数据、随机化和密码学安全方面非常有用。
3. Hash 的使用场景
-
数据完整性验证:哈希算法可以用于验证数据在传输或存储过程中是否被篡改。当数据被传输或存储时,将原始数据进行哈希,并将哈希值与接收到的数据进行比较。如果两个哈希值不同,则说明数据已被篡改。
-
密码存储:哈希算法可以用于存储用户密码,以确保在数据库泄露的情况下,黑客无法直接获取用户密码。将用户密码与随机生成的盐值一起哈希,然后将哈希值存储在数据库中。当用户尝试登录时,将输入的密码与存储的哈希值进行比较。如果哈希值匹配,则说明输入的密码是正确的。
-
数字签名:哈希算法可以用于生成数字签名,以确保数据的真实性和完整性。发送方使用私钥对数据进行哈希和签名,并将签名与数据一起发送。接收方使用公钥对签名进行验证,以确保数据未被篡改和真实的来源。
-
哈希表:哈希算法可以用于实现哈希表数据结构,以提高数据查找和访问的效率。哈希表将数据存储在数组中,并使用哈希函数将键映射到数组的索引。这样,可以快速地根据键查找和访问数据。
补充:哈希在区块链技术中的重要性
区块链是一种去中心化的分布式数据库,它通过不断添加新的数据块来记录和维护数据的完整性和安全性。每个数据块包含一个或多个交易记录,每个交易记录都包含一些重要信息,例如交易金额、参与者地址、时间戳等。
~~~~~~~ 为了确保区块链中的交易记录不被篡改,每个区块都会使用哈希算法计算出一个唯一的哈希值,并将其包含在下一个区块中。这个哈希值是由该区块内的所有交易记录、上一个区块的哈希值、时间戳等信息组成,因此,只要区块链中的任何一个交易记录发生变化,其对应的哈希值就会发生变化。这样一来,就可以通过检查每个区块的哈希值来验证整个区块链是否被篡改过。
4. 哈希碰撞
~~~~~~~ 有的朋友可能会意识到,既然哈希是将任何长度的输入压缩为固定长度的输出,因此理论上会存在两个不同的输入,但是哈希值却相同的情况,事实也确实是这样的,这种情况被称为哈希碰撞(Hash Collision)。
~~~~~~~ 虽然哈希碰撞是可能发生的,但通常情况下,使用强大的哈希算法,如SHA-3、BLAKE2等,可以大大减小哈希碰撞的概率,使其变得非常罕见。此外,为了进一步降低哈希碰撞的风险,还可以采用一些技术,如加盐(Salt)(在原始数据上添加一些额外的随机数据进行哈希,以增加破解的难度)和迭代哈希(Iterated Hashing)。
5.用python计算哈希
~~~~~~~ 在Python中,字符串是以Unicode字符集表示的,而哈希算法通常是针对字节序列计算哈希值的。因此,对于字符串类型的输入,需要将其编码为字节序列,才能进行哈希计算。**message.encode()**是Python中字符串对象的一个方法,用于将字符串编码为指定的字节序列。文章来源:https://www.toymoban.com/news/detail-636467.html
import hashlib
message = "Hello World"
hash_object = hashlib.md5(message.encode())
hash_value = hash_object.hexdigest()
print("Message:", message) # >> Message: Hello World
print("Hash Value:", hash_value) # >> Hash Value: b10a8db164e0754105b7a99be72e3fe5
~~~~~~~ 在哈希算法计算出哈希值后,通常需要将其输出为一种可读的格式,以方便使用和存储。**hash_object.hexdigest()**是Python中哈希对象的一个方法,用于以十六进制字符串的形式输出哈希值。文章来源地址https://www.toymoban.com/news/detail-636467.html
到了这里,关于哈希(Hash)的详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!