您是否想了解密码学中的哈希?如果这样做,那么您来对地方了.
在本文中,我们将探讨有关散列的更多信息.
散列是一种计算机科学技术,用于从一组对象或值中识别对象或值.
听起来令人困惑?
让我们尝试通过示例来了解.
好吧,大学和学校为每个学生提供一个唯一分配的编号。这个唯一的号码可以识别一个学生以及与他有关的信息。生成唯一编号的方法是散列.
另一个受欢迎的例子是图书馆,您可以在书架上找到大量书籍。那里的每本书都有其唯一的标识号,因此可以将其放在庞大的图书馆中!
哈希的一个现代示例是注册游戏的游戏玩家。 Valorant是Riot推出的免费游戏。免费玩意味着成千上万的人会玩游戏.
使用哈希算法生成的唯一标识值来标识每个玩家.
让我们尝试在下面更详细地了解它.
什么是散列?
如上所述,散列是从组中识别对象的方法.
散列后,每个对象都会获得一个唯一的标识号.
但是,从技术上讲这意味着什么?
从技术上讲,数学函数会从任何长度的任何输入字符串生成固定长度的输出.
比特币交易被散列在交易获得唯一ID的地方.
如果您输入“ Hello,World!”在一个 SHA-256哈希算法, 您将获得以下输出:
输入: 你好,世界!
输出: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
在这里,SHA256从给定的输入生成输出。如您所见,我们使用了安全哈希函数(SHA-256)哈希算法。它是其中一种流行的哈希方法,包括Message Direct(MD5)和Secure Hash Function(SHA1)。.
哈希函数的关键属性使其可靠。让我们在下面列出它们.
- 确定性 →这意味着在任何给定情况下,给定输入的输出将相同.
- 耐原像 →防止原像的功能可确保散列值对生成输入值无用.
- 计算效率高 →哈希函数高效且不需要大量的计算资源即可执行.
- 不可逆向工程 →哈希函数不能反向工程.
- 防碰撞 →耐碰撞性确保没有两个输入产生相同的输出.
我们已经在这里为初学者介绍了加密散列。在那里检查:加密哈希:初学者指南.
但是,如果您来这里学习高级知识,您将不会感到失望.
什么是哈希函数和哈希表?以及它们如何工作?
在本节中,我们将更详细地探讨哈希函数和哈希表。在散列方面,存在散列函数。这些功能负责将较大的输入转换为较小的固定输入。哈希表存储输出.
在散列过程中,对象基于它们的键/值对分配到数组。因此,如果将元素数组传递给哈希函数,则将获得一个数组输出,其中每个元素现在都已附加一个键。键/值对在实时访问元素时非常有用,因为它提供了令人印象深刻的O(1)时间.
要实现哈希函数,您可以采用两种首选方法.
- 第一种方法是使用哈希函数将元素转换为整数。接下来,在将哈希表放入哈希表时,可以使用整数输出访问元素.
- 另一个步骤是将元素放入哈希表,然后使用哈希键进行检索.
在第二种方法中,功能如下:
哈希= hash_function(key) 索引=哈希%array_size
在此,哈希和数组大小彼此独立。索引值是根据数组大小计算的。模运算符(%)使我们能够计算值.
简单来说,哈希函数可以定义为可以将任意大小的数据集映射到固定大小的数据集的函数。生成的固定大小的数据集可以存储在哈希表中。哈希函数返回的值有很多名称。它们可以称为哈希值,哈希,哈希和和哈希码.
编写良好的哈希函数
如果要创建良好的哈希函数或机制,则需要了解创建一个哈希函数或机制的基本要求。让我们在下面列出它们:
- 哈希函数需要易于计算。这意味着执行不需要花费很多资源.
- 哈希函数需要均匀分布。这样,哈希表可用于存储哈希值,这样就不会发生聚类.
- 最后一个要求是完全没有碰撞或完全没有碰撞。没有冲突意味着没有单个输出映射到两个输入.
从技术上讲,冲突是哈希函数的一部分,它根本无法从哈希函数中删除。目标是创建一个可以提供良好哈希表性能并通过冲突解决技术解决冲突的哈希函数.
为什么我们需要良好的哈希函数?
要了解对有用的哈希函数的需求,让我们看下面的示例.
假设我们要使用哈希技术创建哈希表,其中输入字符串如下,{“ agk”,“ kag”,“ gak”,“ akg”,“ kga”,“ gka”}
现在,我们创建一个哈希函数,该函数仅将a(97),g(103)和k(107)的ASCII值相加,然后对总和进行307的模运算.
显然,这三个数字的总和也是307。这意味着,如果我们对所有数字进行置换,然后进行求模运算,我们将得到相同的结果。最终结果是将所有字符串存储到相同的索引号。哈希函数的算法时间也将是O(n)复杂度,这是不希望的。我们可以轻松得出结论,我们描述的哈希函数对于现实生活中的场景不是最佳的.
要修复哈希函数,我们可以部署将每个元素的ASCII值之和除以另一个质数727。这样做,对于给定的输入字符串数组,我们将获得不同的输出.
了解哈希表
哈希表在存储哈希函数的结果时非常有用,该哈希函数计算索引,然后根据索引存储值。最终结果将是具有O(1)复杂度的更快的计算过程.
传统上,哈希表是解决需要O(n)时间的问题的不错选择.
因此,如果您捡起固定长度的字符串,然后尝试了解该字符串的字符频率.
因此,如果string =“ aacddce”,则通用方法是多次遍历字符串并存储每个频率.
#提供输入字符串,并计算该字符串中字符的频率
#算法的复杂度为0(n)
temp_list = []开始= "一种" str = "ababcddefff" def alpha_zeta():对于位于范围(0,26)中的i,alpha =’a’:temp_list.append(alpha)alpha = chr(ord(alpha)+ 1)返回temp_list temp_list = alpha_zeta()# character_frequency(str,temp_list):temp_list中的每个:freq = 0
上面程序的输出如下:
a 2 b 2 c 1 d 2 e 1 f 3 g 0 h 0 i 0 .. ..
现在,让我们在C ++中实现一个哈希表并计算字符频率.
#include使用命名空间std; int频率[26]; int hashFunc(char c){返回(c-‘a’); } void countFre(string S)for {int i = 0; i< S.length(); ++ i){int index = hashFunc(S [i]);频率[索引] ++;对于(int i = 0; i<26; ++ i){ << (字符)(i +’a’) << ” << 频率[i]<< 恩德尔}} int main(){cout<<"你好,世界"; countFre("abbaccbdd"); }
该程序的输出如下:
2 b b b b b b b b b b 2 b b b b b b b b b b b b b 2 2 b b b b b 2
与其他线性方法相比,该算法的O(N)复杂度使其速度更快.
如何解决碰撞
解决哈希函数冲突的方法很独特。流行的方法之一是单独的链接,也称为开放式哈希。它是用链表实现的,其中链中的每个元素本身就是链表。这种方法能够存储元素并确保某些元素只是特定链接列表的一部分,从而解决了冲突。这意味着没有两个输入值可以具有相同的输出哈希值.
在Python中探索哈希
在本节中,我们将快速了解Python中的哈希。我们选择Python的原因是它易于阅读,任何人都可以轻松使用它.
由于哈希是常见功能,因此它已在Python库中实现。通过使用模块,可以提供一个对象作为其输入,然后返回哈希值.
hash方法的语法为:
哈希(对象)
如您所见,它接受一个参数,即对象。该对象可以是整数,浮点数或字符串.
hash()方法的返回值取决于输入。对于整数,它可能返回相同的数字,而对于十进制和字符串,则可能不同.
让我们看下面的一些例子.
num = 10分贝= 1.23556 str1 = "尼蒂什" 打印(hash(num))打印(hash(deci))打印(hash(str1))
上面代码的输出如下:
但是,哈希不能应用于所有对象类型。例如,如果您还记得我们在第一个程序中创建了一个从a到z的列表。如果我们尝试对其进行哈希处理,则输出窗口将通过TypeError:unhashable类型:“ list”
要将哈希应用于对象列表,您需要使用元组.
元音=(’a’,’e’,’i’,’o’,’u’)print(哈希(元音))输出⇒-5678652950122127926
密码学中的散列
散列对密码学很有用。比特币利用哈希来创建和管理Merkle树
同样,散列在很长一段时间以来一直是密码学的一部分。但是,哈希的最佳用例是对密码进行哈希处理并将其存储.
默克尔树
Merkle树是一种数据结构,在大型数据池中进行安全数据验证时非常有用。在开放网络中存储和访问数据时,比特币和以太坊都利用Merkle树解决了许多技术障碍.
任何集中式网络都不必担心存储和访问数据,因为只有一个来源可以访问和存储数据。但是,当存在分散网络时,方程式会发生变化,因为现在需要在数百个参与对等方之间复制数据.
默克尔树通过提供一种可靠且有效的方式在同级之间共享和验证数据来解决该问题.
默克尔树示例
但是,为什么我们在这里讨论默克尔树? Merkle树使用哈希作为核心功能来连接不同的节点和数据块.
默克尔树(Merkle Trees)是一棵倒置树,可以总结整个交易集.
如果您想了解有关Merkle树及其在加密中如何使用哈希的更多信息,请查看我们的详细指南:
默克尔树指南。在那里,我们讨论了如何在比特币和其他用例中完成Merkle树的实现.
采矿过程
挖掘过程还利用了哈希。当涉及比特币挖矿时,需要时将新块添加到区块链中.
需要遵循一种将区块添加到区块链的方法。当新块到达时,将根据该块的内容生成一个哈希值。另外,如果生成的哈希值大于网络难度,则开始将块添加到区块链的过程.
完成后,网络中的所有对等方都确认添加了新块.
但是,这种情况很少出现,因为在大多数情况下,网络难度始终比生成的哈希值高。还有一个方面在采矿过程中起着至关重要的作用。是现时.
随机数被添加到块的哈希中,并且是任意字符串。完成后,将连接后的字符串与难度级别进行比较。如果难度级别低于连接字符串,则更改随机数,直到难度级别更高.
该过程可以归纳为以下步骤:
- 每当生成或采用新块时,将对内容进行哈希处理以创建新的哈希值,
- 生成一个新的现时值并将其附加到哈希表中
- 哈希处理发生在新的联系字符串上
- 然后将哈希的最终值与网络的难度级别进行比较
- 如果最终哈希值小于随机数,则再次重复该过程。仅当哈希值大于随机数时,该过程才停止.
- 一旦难度级别更高,Block便加入了链条
- 然后,矿工将负责开采新区块并在彼此之间分享奖励.
术语“哈希率”也从这里出现。散列速率是散列操作发生的速率。较高的哈希率意味着矿工将需要更多的计算能力才能参与采矿过程.
结论
这使我们结束了对密码学的深入了解。我们详细介绍了哈希,并探讨了其背后的代码.
那么,您对此有何看法?在下面发表评论,让我们知道.
#常问问题
什么是密码学中的哈希?
在密码学中,哈希是一种使用有效方法将数据转换为唯一的文本字符串的方法。此外,对数据类型或数据大小也没有限制-哈希适用于所有数据.
加密中如何使用散列?
密码学利用散列来散列密码或生成唯一的标识号.