哈希是什么,谁能解释一下?

2024-05-18 07:59

1. 哈希是什么,谁能解释一下?

哈希音译自“Hash”,又名为“散列”。本质上是一种计算机程序,可接收任意长度的信心输入,然后通过哈希算法,创建小的数字“指纹”的方式。
例如数字与字母的结合,输出的就为“哈希值”。从数学术语上说,就是这个哈希函数,是将任意长度的数据,映射在有限长度的域上。总体而言,哈希函数用于,将消息或数据压缩,生成数据摘要,最终使数据量变小,并拥有固定格式。
那么哈希算法的作用又是什么呢?
(1) 在庞大的数据库中,由于哈希值更为短小,被找到更为容易,因此,哈希使数据的存储与查询速度更快。
(2) 哈希能对信息进行加密处理,使得数据传播更为安全。
哈希算法解决了什么生活问题?
看似深奥的数学函数,又或是计算机程序的哈希算法,其实跟我们的生活息息相关。就拿每年双十一的快递来说,实际上,哈希算法原理提高了快递入库出库的速度。

哈希是什么,谁能解释一下?

2. 什么是哈希

我们先来讲个故事哈。
  
  
 有一个人每次打开区块链文章,都意气风发,暗暗下决心要发愤图强,看了一会儿,发现很难看懂什么,硬逼着自己学习,却已是强弩之末,最后只能末学肤受,学了个皮毛而已。
  
 那个人就是我哈,希望大家不要末学肤受,而能食髓知味,深刻理解区块链知识。
  
 这四个成语。
  
 意气风发~发奋图强~强弩之末~末学肤受
  
 每个成语的第一个字,是前一个成语的最后一个字,组成了一个成语链的链式结构。
  
 我们来类比一下,区块链的链式结构。
  
                                          
 区块链0,1,2,3的链式结构是靠什么形成的呢?
  
  
 是靠前一个区块的哈希值,也叫做父区块哈希值。
  
 区块0是区块1的父区块。
  
 区块1是区块0的子区块。
  
 区块0的哈希值对区块1而言,就是父区块的哈希值。
  
 父区块哈希值,就是上面成语链式结构里,把前后两个成语连接起来的那个字。
  
 要理解区块链链式结构,还要理解什么叫哈希。
  
                                          
 再讲个故事哈。
  
  
 小黑同学要把一袋猫粮快递给大白老师。
  
 他让哈希公司的快递员上门取件,打包完成后,拿到了快递单号。
  
 这个寄快递的过程中,有三个关键步骤。
  
 1.选择要寄送的物品。
  
 2.选择哈希快递公司,对物品进行快递打包。
  
 3.拿到快递单号。
  
 哈希公司给的快递单号就是哈希值。
  
 大白老师对小黑选择的哈希公司很满意。
  
 1.不论小黑寄的东西有多大,经过哈希公司打包后,拿到手的快递包裹都一样大。
  
 2.哈希公司打印出来的快递单号也就是哈希值,除了让你查询物流的实时状况,还可以让你知道包裹中的物品有没有被人调包或撰改。
  
 比如小黑寄给大白的猫粮,在运送过程中,哪怕袋子上的配料表,被人改了一个标点符号,哈希公司给的快递单号,也就是哈希值都会实时发生变化,警示小黑快递包裹发生了异常情况。
  
 哈希公司确实很厉害哈。

3. 什么是哈希?

散列是指从可变大小的输入生成固定大小的输出的过程。这是通过使用称为散列函数(作为散列算法实现)的数学公式来完成的。 
  
  尽管并非所有哈希函数都涉及密码学的使用 ,但所谓的密码哈希函数是加密货币的核心。多亏了它们,区块链和其他分布式系统能够实现显着水平的 数据完整性和安全性。 
  
  传统和加密散列函数都是确定性的。确定性意味着只要输入不变,散列算法将始终产生相同的输出(也称为摘要或散列)。 
  
  通常,加密货币的散列算法被设计为单向函数,这意味着如果没有大量的计算时间和资源,它们就无法轻易恢复。换句话说,从输入创建输出非常容易,但在相反的方向(仅从输出生成输入)相对困难。一般来说,越难找到输入,哈希算法被认为越安全。 
  
 
  
  
  不同的散列函数将产生不同大小的输出,但每种散列算法可能的输出大小始终是恒定的。例如,SHA-256 算法只能生成 256 位的输出,而 SHA-1 将始终生成 160 位的摘要。 
  
  为了说明这一点,让我们通过 SHA-256 哈希算法(比特币中使用的算法)运行“Bitcoin”和“bitcoin”这两个词。 
  
 
  
  
  请注意,微小的更改(第一个字母的大小写)会导致完全不同的哈希值。但由于我们使用 SHA-256,输出将始终具有 256 位(或 64 个字符)的固定大小 - 无论输入大小如何。此外,无论我们通过算法运行这两个单词多少次,两个输出都将保持不变。 
  
  相反,如果我们通过 SHA-1 哈希算法运行相同的输入,我们将得到以下结果: 
  
 
  
  
  值得注意的是,首字母缩略词 SHA 代表安全哈希算法。它指的是一组加密哈希函数,包括 SHA-0 和 SHA-1 算法以及 SHA-2 和 SHA-3 组。SHA-256 是 SHA-2 组的一部分,还有 SHA-512 和其他变体。目前,只有 SHA-2 和 SHA-3 组被认为是安全的。 
  
 
  
  
  传统的哈希函数具有广泛的用例,包括数据库查找、大文件分析和数据管理。另一方面,加密散列函数广泛用于信息安全应用,例如消息认证和数字指纹。就比特币而言,加密哈希函数是挖矿过程的重要组成部分, 也在新地址和密钥的生成中发挥作用。 
  
  散列的真正威力在于处理大量信息时。例如,可以通过哈希函数运行一个大文件或数据集,然后使用其输出来快速验证数据的准确性和完整性。由于散列函数的确定性,这是可能的:输入将始终产生简化的、压缩的输出(散列)。这种技术消除了存储和“记住”大量数据的需要。 
  
  散列在区块链技术的背景下特别有用。比特币区块链有几个涉及散列的操作,其中大部分在挖掘过程中。事实上,几乎所有的加密货币协议都依赖散列来将交易组链接和压缩成块,并在每个块之间产生加密链接,从而有效地创建区块链。 
  
 
  
  
  同样,部署密码技术的散列函数可以定义为密码散列函数。一般来说,破解密码哈希函数需要无数次的蛮力尝试。对于“还原”加密哈希函数的人来说,他们需要通过反复试验来猜测输入是什么,直到产生相应的输出。然而,也有可能不同的输入产生完全相同的输出,在这种情况下会发生“冲突”。 
  
  从技术上讲,加密哈希函数需要遵循三个属性才能被视为有效安全。我们可以将这些描述为抗碰撞性、抗原像性和抗二次原像性。 
  
  在讨论每个属性之前,让我们用三个简短的句子总结它们的逻辑。 
  
 
  
  
  如前所述,当不同的输入产生完全相同的散列时,就会发生冲突。因此,哈希函数被认为是抗冲突的,直到有人发现冲突为止。请注意,任何散列函数都将始终存在冲突,因为可能的输入是无限的,而可能的输出是有限的。 
  
  换句话说,当发现碰撞的可能性非常低以至于需要数百万年的计算时,哈希函数是抗碰撞的。因此,尽管没有无冲突的哈希函数,但其 中一些函数足够强大,可以被视为具有抵抗力(例如,SHA-256)。 
  
  在各种 SHA 算法中,SHA-0 和 SHA-1 组不再安全,因为已经发现冲突。目前,SHA-2 和 SHA-3组被认为是抗冲突的。 
  
 
  
  
  原像电阻的特性与单向函数的概念有关。当有人找到生成特定输出的输入的可能性非常低时,哈希函数被认为是抗原像的。 
  
  请注意,此属性与前一个属性不同,因为攻击者会试图通过查看给定的输出来猜测输入是什么。另一方面,当有人发现产生相同输出的两个不同输入时,就会发生冲突,但使用哪个输入并不重要。 
  
  原像抗性的特性对于保护数据很有价值,因为消息的简单散列可以证明其真实性,而无需披露信息。在实践中,许多服务提供商和 Web 应用程序存储和使用从密码生成的哈希值,而不是明文密码。 
  
 
  
  
  为简化起见,我们可以说第二原像电阻介于其他两个属性之间。当有人能够找到一个特定的输入,该输入生成与他们已经知道的另一个输入相同的输出时,就会发生二次原像攻击。 
  
  换句话说,第二原像攻击涉及寻找碰撞,但不是搜索生成相同散列的两个随机输入,而是搜索生成由另一个特定输入生成的相同散列的输入。 
  
  因此,任何抗碰撞的哈希函数也能抗第二原像攻击,因为后者总是意味着碰撞。然而,人们仍然可以对抗碰撞函数执行原像攻击,因为它意味着从单个输出中找到单个输入。 
  
 
  
  
  比特币挖矿有很多步骤 涉及哈希函数,例如检查余额、链接交易输入和输出,以及对区块内的交易进行哈希处理以形成 默克尔树。但比特币区块链安全的主要原因之一 是矿工需要执行无数的散列操作,以便最终为下一个区块找到有效的解决方案。 
  
  具体来说,矿工在为其候选块创建哈希值时必须尝试几种不同的输入。本质上,如果他们生成以一定数量的零开头的输出哈希,他们将只能验证他们的块。零的数量决定了挖矿难度,它根据网络的哈希率而变化。 
  
  在这种情况下,哈希率表示在比特币挖矿中投入了多少计算机能力。如果网络的哈希率增加,比特币协议会自动调整挖矿难度,使挖出一个区块所需的平均时间保持在接近 10 分钟。相反,如果几个矿工决定停止挖矿,导致算力大幅下降,则会调整挖矿难度,使其更容易挖矿(直到平均出块时间回到10分钟)。 
  
  请注意,矿工不必发现冲突,因为他们可以生成多个散列作为有效输出(从一定数量的零开始)。所以对于某个区块有几种可能的解决方案,矿工只需要找到其中一种——根据挖矿难度确定的阈值。 
  
  由于比特币挖矿是一项成本密集型任务,矿工没有理由欺骗系统,因为这会导致重大的经济损失。加入区块链的矿工越多,它就变得越大越强大。(国内禁止参与挖矿) 
  
 
  
  
  毫无疑问,哈希函数是计算机科学中必不可少的工具,尤其是在处理大量数据时。当与密码学结合时,散列算法可以非常通用,以多种不同的方式提供安全性和身份验证。因此,加密哈希函数对几乎所有加密货币网络都至关重要,因此了解它们的属性和工作机制对于任何对区块链技术感兴趣的人肯定会有所帮助。

什么是哈希?

4. 什么是哈希?

在Java中, 哈希码 代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其 哈希码 相等,则这两个字符串是相等的。其次, 哈希码 是一种数据结构的算法。常见的哈希码的算法有:
  
 1:Object类的hashCode.返回对象的 内存地址 经过处理后的结构,由于每个对象的 内存地址 都不一样,所以哈希码也不一样。
  
 2: String类 的hashCode.根据 String类 包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
  
 3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
  
 用最简单的方法来说,hashcode就是一个签名。当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话两个对象就肯定不一样。
  
 一般用hashcode来进行比较两个东西是不是一样的,可以很容易的排除许多不一样的东西。
  
 最常用的地方就是在一堆 东西里 找一个东西。先用你要找的东西的hashcode和所有东西的hashcode比较,如果不一样的话就肯定不是你要找的东西。如果一样的话就很可能是你要找的东西。然后再进行仔细的比较两个东西是不是真的一模一样。
  
 //一个不能加重复内容的容器
  
 class Set {
  
 Object[] objs = new Object[10]; //装东西的的数组
  
 int size = 0; //已经有几个东西
  
 //添加新东西,成功的话返回true,如果已经有了的话返回false
  
 boolean add(Object o) {
  
 for(int i=0;i
  
 if(objs[i].hashCode() == o.hashCode()) //如果hashcode一样的话就说明两个有可能是一样的
  
 if(objs[i].equals(o)) return false; //仔细的确认一下是不是真的一样,如果一样的话就不加入这个对象
  
 }
  
 objs[size++]=o; //确认没有过这个东西,加入数组
  
 return true;
  
 }
  
 }
  
 当使用这个类的时候要确保两个一样的东西的hashcode肯定是一样的。两个不同的东西的hashcode可以是一样的,不过这样会减慢运行速度,所以尽量避免(也就是所谓的碰撞)。
  
 1.一个对象的散列码,什么是散列码呢,简单的说就是通过哈希算法算出来的一大窜数字之类的东西和内存有关.
  
 如果对象1和对象2相等,说明他们的散列码相等!反过来就不一样了!
  
 2.另外hashcode可以减少equals比较的次数,提高运算效率。如果你想深入hashcode到底怎么回事,还是查下权威资料!
  
 回到最关键的问题,HashCode有什么用?不妨举个例子:
  
 1、假设内存中有0 1 2 3 4 5 6 7 8这8个位置,如果我有个字段叫做ID,那么我要把这个字段存放在以上8个位置之一,如果不用HashCode而任意存放,那么当查找时就需要到8个位置中去挨个查找
  
 2、使用HashCode则效率会快很多,把ID的HashCode%8,然后把ID存放在取得余数的那个位置,然后每次查找该类的时候都可以通过ID的HashCode%8求余数直接找到存放的位置了
  
 3、如果ID的HashCode%8算出来的位置上本身已经有数据了怎么办?这就取决于算法的实现了,比如ThreadLocal中的做法就是从算出来的位置向后查找第一个为空的位置,放置数据;HashMap的做法就是通过链式结构连起来。反正,只要保证放的时候和取的时候的算法一致就行了。
  
 4、如果ID的HashCode%8相等怎么办(这种对应的是第三点说的链式结构的场景)?这时候就需要定义equals了。先通过HashCode%8来判断类在哪一个位置,再通过equals来在这个位置上寻找需要的类。对比两个类的时候也差不多,先通过HashCode比较,假如HashCode相等再判断equals。 如果两个类的HashCode都不相同,那么这两个类必定是不同的 。
  
 举个实际的例子Set。我们知道Set里面的元素是不可以重复的,那么如何做到?Set是根据equals()方法来判断两个元素是否相等的。比方说Set里面已经有1000个元素了,那么第1001个元素进来的时候,最多可能调用1000次equals方法,如果equals方法写得复杂,对比的东西特别多,那么效率会大大降低。使用HashCode就不一样了,比方说HashSet,底层是基于HashMap实现的,先通过HashCode取一个模,这样一下子就固定到某个位置了,如果这个位置上没有元素,那么就可以肯定HashSet中必定没有和新添加的元素equals的元素,就可以直接存放了,都不需要比较;如果这个位置上有元素了,逐一比较,比较的时候先比较HashCode,HashCode都不同接下去都不用比了,肯定不一样,HashCode相等,再equals比较,没有相同的元素就存,有相同的元素就不存。如果原来的Set里面有相同的元素,只要HashCode的生成方式定义得好(不重复),不管Set里面原来有多少元素,只需要执行一次的equals就可以了。这样一来,实际调用equals方法的次数大大降低,提高了效率。

5. 什么是哈希规则

HASH规则源于传统的英国式的纸片追踪游戏。

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

常用HASH函数
·直接取余法:f(x):= x mod maxM ; maxM一般是不太接近 2^t 的一个质数。
·乘法取整法:f(x):=trunc((x/maxX)*maxlongit) mod maxM,主要用于实数。
·平方取中法:f(x):=(x*x div 1000 ) mod 1000000); 平方后取中间的,每位包含信息比较多。

HASH已经遍及全世界,许多人甚至以到世界各地参加HASH、收集不同的HASH T恤为乐。第一次比赛时,输的一方必须坐冰。

什么是哈希规则

6. 哈希的哈希活动

Hash活动没有固定的成员和组织,也不存在固定的模式,各个城市的具体做法各有不同,但所有的hash都有两个共同的主题:跑步和啤酒,其参加者也因此自称“The running club with a drinking problem”。经过几十年的发展,hash活动已经超越简单的体育锻炼活动,而形成了一种特色鲜明、独具魅力的文化。一、Hash活动崇尚一种自然健康、团结友爱、积极向上、挑战自我的精神。Hash中最重要的一件事就是跑步,而且是有趣味、有难度的跑步。每次活动都有一两名参加者志愿充当“兔子”(hare)的角色,事先在野外设置好错综复杂的路线,而自称为猎狗(harriers)的参加者则追踪而至,顶着烈日骄阳或淋着瓢泼大雨,寻找兔子留下的蛛丝马迹。不论是攀山越岭还是涉水过河,是披荆斩麻还是或踏污踩粪,只要是兔子布下的路线,猎狗们就义无反顾地一跑到底,决不偷工减料。这样一两个小时跑下来,不仅锻炼了身体,更磨炼了意志。猎狗们在追踪过程中,每到一个岔路口,都需要分工协作,分头找路,才能最快地找到正确的道路。而遇上沟沟坎坎或荆棘刺丛的时候,参加者更是会伸出手来互相帮助。如果有人迷了路,他不仅会经历一次对自己应变能力的挑战,更将体会到同伴在寻找他的过程中表现出来的团结和友爱。二、Hash活动体现了一种幽默、开朗、豁达而且自然随意的生活态度。在钢筋混凝土丛林中忙碌的现代人最需要的就是贴近自然,放松紧张的身心,而这也正是参加hash的人们所推崇的生活方式。幽默可是说是全世界hash参加者的共性。他们最擅长的就是自嘲----自称为“猎狗”,海口的hash参加者还自称为“害虫”,每个人有一个可笑甚至恶心的外号,比如“卖女孩的小火柴”、“肉肉”、“肮脏的鱼”等等。唱歌、讲故事、说笑话、相互捉弄、插科打诨……每一次hash活动都充满欢笑和快乐。看看沾满泥水的跑鞋和挂满草刺的小腿,畅饮一口冰啤酒高歌一曲,不由得豪气顿生,早不见了办公室里拘谨刻板的模样。新老朋友一起在空旷的野外大声喊叫,放肆地说笑话逗乐子,纵情地歌唱和欢笑,在音乐声中又闹又跳,疲倦的是躯体,而心灵得到了彻底的放松。Hash活动过程中不准从事商业活动,不准打手机,不准谈工作,所有参加者都以绰号互称,远离铜臭气和复杂的人事关系,为纯真的友谊提供了生长的环境。难怪Hash里面许多人成了意气相投的好朋友之后,才猛然发现原来自己连对方是做什么生意的、有没有结婚都不知道。Hash活动不以营利为目的,每次活动的结余归入基金供大活动时支出;所有工作都由参加者齐心协力地完成;每期的兔子可以按自己的意愿自由地组织一次跑步。这正是hash的魅力所在:为参加者提供一个可以尽情展现真我的机会。正是出于对大自然的热爱,Hash参加者们对环境保护尤为重视。空瓶空罐绝对不允许乱扔、垃圾袋必须是可降解塑料做的、不准拈花惹草、不得踩坏庄稼、等等,这些规矩都是每一位hash参加者严格恪守,并在生活中也身体力行的。海口hash的参加者还曾组织过在五指山顶、牙龙湾、尖峰岭等风景点清理垃圾的活动。三、Hash还是一项各种文化汇集、交流的活动。Hash活动不仅仅是体育休闲活动。Hash参加者强烈的表现欲在这一宽松的环境中得到鼓励和张扬。他们创造了种种个性鲜明的hash徽标,改编了上千首hash歌曲,制作了不计其数的、风格各异的T恤、帽子、杯垫,出版了大量或精美或简陋然而同样精彩的hash杂志、报纸、宣传册,在Internet上,只要输入“hash”或者“hhh”进行搜索,可以发现成百上千个hash网站。可以说,hash已经有了自己的文化。参加过hash活动后,有人可能会不喜欢这种文化,可是没有人会忘记这样一种文化。它自有它独特的、令人无法忘怀的风味。在衍生出自己的文化之外,Hash活动从一开始就体现了不同文化的碰撞和交流。第一次hash跑步,就是由旅居马来西亚的英国人组织的。世界各地的hash,吸引了各种各样不同文化的人参加,尤其是旅居当地的外国人。这一点在英美之外的国家的hash中特别明显。因此,hash除了带有明显的英美文化气息外,还成了各种文化交汇融合的活动。像在中国的大多数hash,就成了各种外国人和中国人共同喜爱的活动,英语成为主要的交流手段,而他们的徽标、T恤设计中却透着浓郁的中国文化气息。Hash还是一个全球性的休闲活动,除了各地自有的hash活动,还有定期举行的“泛亚hash”、“泛太平洋hash”等等区域性的活动,每四年还有一次“全球hash”。这种大规模的hash,更是云集来自世界各地的爱好者,无形中也就是一次文化的盛会。Hash活动于生俱来的宽容和自由的特性,为各种不同文化背景的参加者提供了一个平等、宽松、随意、自由发挥的环境。所有的参加者自由地来,自由地去,各人对各人的言行和安全负责,不论国籍、年龄、种族、肤色、职业、教育程度如何,都只是“猎狗”或者“兔子”这两种角色之一种,以绰号相称,甚至真名都不为人知。在“跑步”和“啤酒”这两个主题下,参加者们彻底放下面子和成见,打破各种人为的隔阂和壁垒,真正玩到一块儿,发展友谊,取长补短,尽情展现各自的风采。海口的hash最早也是由外国人发起,除了旅居海口的外国人,还吸引了许多外企的白领和英语爱好者参加。后来由于爱好hash的外国人逐渐离开海口,参加海口hash的主要是中国人,其中大部分是旅居海口的内地人。Hash本身的渊源、活动形式及其精神都带有浓厚的西方文化色彩,必然会对其参与者造成一定的影响,而中国古老的文化也给海口hash烙上独特的印迹。海口hash的参与者有老有少、有男有女,分别来自社会各个层面,有着不同的文化素养和人生观。他们来参加hash,不仅面对hash本身具有的西方文化的冲击,而且也面临着相互间不同观念带来的冲突。但只要是热爱运动和自然的人,在接受hash的同时,也就会接受hash宽容、自由的氛围及其多姿多彩的文化,自然也就会变得更宽容、更善于理解他人。正是由于hash具有这样独特的文化魅力,这项休闲活动才持续了近70年而不衰,风靡全球几千个城市,受到各界的广泛关注。尤其是定期举行的跨地区的hash,比如环亚太地区的hash,或者环东南亚的hash,每次都在不同的城市举行,对于举办城市来说,这无疑是当地旅游业发展的一次良好契机