哈希算法的用途

什么是哈希算法

一说到哈希算法, 我瞬间就想到了哈希函数、哈希表, 其实他们并不是一回事.

简单来说, 哈希算法就是将任意长度的字符串通过计算转换为固定长度的字符串, 不对, 不光字符串, 应该说是将任意长度的二进制串转换为固定长度的二进制串, 这个转换的过程就是哈希算法.

既然将任意长度的字符串转换成固定长度的, 那么冲突就不可避免了, 比如将0-100所有的数字, 映射到0-10这十个数字上, 难免会发生冲突. 一般来说, 计算得出的哈希值越长, 冲突的概率就越低, 比如说, 计算过后, 哈希值为16个字节, 也就是128位, 那么就有2^128个不同的哈希值, 发生哈希冲突的概率为(1/2)^128, 这个概率可以说很低了.

以MD5为例, 以下是经过MD5转换后的值:

朋友你好: 677fe16950241e74ef632efb2b9f92a7

朋友你好!: 6efa551df87d9de987f17be4e73eb720

可以看到, 哪怕仅仅差了一个感叹号, 计算后的值也是天壤之别, 所以很多网站上下载文件的同时还提供md5值, 现在能够理解了吧, 你将下载后的文件通过md5算法进行计算, 得到的字符串如果和网站给定的不相同, 说明文件被修改过了.

当然, 哈希算法不仅仅只有md5这一种, 以用途来分析哈希算法, 就不说哈希算法的原理了, 因为我不会.

1. 数据校验

上面说到的md5就是其中的一个, 好像还有一个什么SHA, 不过我不知道, 也就不展开探讨了.

md5可以将一个文件经过计算转换成一个指定长度的字符串, 可以防止文件被篡改, 但是通过加密后的字符串很难逆向推出原文.

前面那个例子可以看到, 即使文件被修改了一点点, 也会导致计算后的值发生很大变换.

2.唯一标识

比如说, 现在有十万个文件, 给你一个文件, 要你在这十万个文件中查找是否存在. 一个很笨的办法就是把每一文件都拿出来, 然后按照二进制串一一进行对比. 但是这个操作注定是比较费时的.

可以用哈希算法对文件进行计算, 然后比较哈希值是否相同. 因为存在哈希冲突的情况, 你可以在相同哈希值的文件再进行二进制串比较.

3.哈希表

在哈希表中使用哈希函数已经并不陌生了, 不再赘述.

4.负载均衡

比如说, 现在又多台服务器, 来了一个请求, 如何确定这个请求应该路由到哪个路由器呢?当然, 必须确保相同的请求经过路由到达同一个服务器. 一种办法就是保存一张路由关系的表, 比如客户端IP和服务器编号的映射, 但是如果客户端很多, 势必查找的时间会很长. 这时, 可以将客户端的唯一标识信息(如:IP、username等)进行哈希计算, 然后与服务器个数取模, 得到的就是服务器的编号.

5.分布式存储

当我们有大量数据时, 一般会选择将数据存储到多个服务器, 为了提高读取与写入的速度嘛. 决定将文件存储到哪台服务器, 就可以通过哈希算法取模的操作来得到.

但是, 如果数据多了, 要增加服务器了, 问题就来了, 比如原来是10台服务器, 现在变成15台了, 那么原来哈希值为16的文件被分配到编号6的服务器, 现在被分配到编号1的服务器, 也就意味着所有文件都要重新计算哈希值并重新非陪服务器进行存储. 一致性哈希就是这个用途, 可以查找我的历史文章.

暂时我能想到的就只有这些, 当然, 哈希算法的用途还有很多, git中的commit id等, 但是我不太了解, 就假装没有吧, 嘿嘿


有时对用户的密码进行MD5加密再保存, 确实要比明文保存好的多. 但是, 你以为通过哈希算法进行加密就万事大吉了么? 不好意思, 并不能, 像前面提到的MD5就已经号称别破解了.

比如, 你将用户的密码进行MD5加密后进行保存, 若有心人拿到你的数据库数据, 虽然得到的是加密后的密码, 但是只要准备一个常用密码的字典, 将字典中的密码进行加密后与数据库保存的数据进行比较, 如果相同, 基本上就可以确定了.

我感觉可以对密码进行双层加密, 也就是使用两个不同的加密算法, 一个算法的输出作为另一个的输入, 增大一些破解的难度吧.

再见!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决/mnt中有hgfs无共享文件

问题: 已经设置了共享目录,进入 /mnt/hgfs 文件夹,但发现提示没有共享的文件夹 使用以下办法解决(root权限): 解决: 1. 切换到root权限 sudo passwd root 2. 查看当前有哪些共享的目录 vmware-hgfsclient 3.进行挂…

贪婪算法回顾

回顾 还记的贪婪算法么? 如果你不记得了, 看了下面这个例子你一定会想起来, 因为这个例子太普遍了, 几乎每个将贪婪算法的地方, 第一个例子都是它, 言归正传. 问题: 现在有如下课程表, 要将这些课尽可能多的安排在教室A内. 课程名开始时间结束时间语文课9:0010:00数学课9:3…

【安全】基础概念梳理-基本加密方式、数字签名、证书

一、两种基本加密方式 1.1 对称加密 对称加密是指双方持有相同的密钥进行通信,加密速度快。常见的对称加密算法有DES、3DES、AES等。存在问题:通信双方如何获得相同的密钥? 1.2 非对称加密 非对称加密,又称为公开密钥加密&#…

PHP 自动加载

回顾 开始的时候, 如果想在一个php文件中使用其它文件的类或方法, 需要通过include/require方法将文件包含进来. 这种方法的缺点也很明显: 如果需要引入很多文件, 就需要很多的include语句, 不仅不美观, 而且也难免会又遗漏如果多个文件中定义了相同名称的常量, 会导致抛出重…

【坑】云相关

1. NAT NAT(Network Address Translation,网络地址转换:当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密&…

Pycharm 2019 添加 docker 解释器

打开docker的tls 点击设置: 搜索docker, 添加: 点击解释器选项 添加 选择docker 这里说缺少映射, 先不管 接下来, 创建一个新项目, 在选择解释器的时候, 如果选择刚刚添加的, 会报错, 先选一个能用的, 进到项目再换 在右下角的解释器小部件, 选择我们刚刚添加的 然后就可以正常…

【待补】Wireshark+BLE dongle: BLE数据包捕获以及分析

文章目录前言1. 捕获BLE数据包2. 分析BLE数据包2.1 过滤掉不感兴趣的BLE数据包2.2 利用Wireshark内嵌工具生成图表前言 硬件:Nordic 52840 dongle 软件: Wireshark 1. 捕获BLE数据包 待补充。 2. 分析BLE数据包 2.1 过滤掉不感兴趣的BLE数据包 以自…

js动态添加div

问题 有没有遇到过这样的需求, 在页面上会有不定个input, 点击添加按钮就添加 每次写这玩意好麻烦啊, 把他封装起来, 需要的时候调用就好了 思路 因为每个input标签的name如果相同的话, 在后端接收的时候会出错, 所以我的解决办法就是在name后加上一个数字, 后端用一个循环进…

【坑】Sketch算法——Count-Min Sketch和Universal Sketch

文章目录参考链接一、Sketch算法用来做什么?二、Min-count sketch基础思想:进阶:特点:三、Universal Sketch参考链接 [1] Count-Min Sketch: https://blog.csdn.net/pipisorry/article/details/64126199 [2] Cormode G, Muthukrishnan S. An improved …

css中的单位

前端开发中, 做适配是少不了的, 这就用到了css中的各种长度单位, 做一下总结 在css中, 长度单位分为以下几种 绝对单位: px、in、cm、mm、pt、pc百分比单位: vw、vh、vmin、vmax、%相对单位: em、rem、ex、ch 各单位介绍 px 不用过多介绍, 精确像素 in 寸 cm 厘米 mm…

【5G入门】MCS调制编码方案简介

​ 目录参考资料:1. MCS简介MCS是什么如何选择MCS有哪些MCS可供选择如何配置MCS示例参考资料: 链接: 5G NR Modulation and Coding Scheme – Modulation and Code Rate. 1. MCS简介 MCS是什么 MCS(Modulation and Coding Scheme&#xf…

caffe初体验

caffe是一个深度学习的框架, 具体我也不太清楚, 可以自行百度吧, 我也是刚刚知道有这么一个框架, 才疏学浅啊. 在安装完caffe, 我的第一个想法就是, 别管他是个啥东西, 总得先让我运行一些看一看吧. 刚好, 官方就准备了一些数据, 供我们运行一下看一看使用. 因为我是通过dock…

【安全】进阶的Mosquitto:搭建一个安全的MQTT服务

目录一、基础版Mosquitto安装及运行Mosquitto安装Mosquitto运行二、基础安全版Mosquitto安装及运行(需要输入密码)Mosquitto安装Mosquitto配置Mosquitto测试效果三、安全版Mosquitto安装及运行Mosquitto安装TLS安装Mosquitto配置Mosquitto测试效果注意一…

PHP注释标记整理

什么是注释标记 我们在平常写代码或看别人写的代码时, 在方法的说明注释中经常会有这样的注释: /*** param $num* return array*/上面的*param* return 就是注释标记 注释标记用于生成文档, param指明需要接收的参数, return指明返回值 在使用 phpDocumentor 等工具生成文档…

PHP 循环引用的问题

问题 为了引出问题, 先来看下面一段代码: <?php $arr [a, b,c, d, ];foreach ($arr as &$each){echo $each; } echo PHP_EOL; foreach ($arr as $each){echo $each; }这段代码很简单, 输出数组的元素两次, 感觉会输出两次 abcd? 不好意思, 输出结果如下:  是不是感…

redis常规命令记录

概述 因为redis是单线程执行&#xff0c;所以不用关心并发问题。 简单记录一下redis的操作命令&#xff0c;留作查阅&#xff0c;回头再整理一下事物等操作。 reids中存储的是kev-value形式, 其中的value有几种: 字符串: 就是简单的string 字符串列表: 有序可重的列表 字符…

代码整洁之道-函数

什么是一个好的函数或者叫方法&#xff0c;只要能让函数明确的表达其意图&#xff0c;让读者能够一眼看出是一个怎样的函数&#xff0c;其接收什么参数&#xff0c;返回什么结果&#xff0c;做了什么事情。能做到这&#xff0c;大概就能算作一个好的函数了&#xff0c;看上去很…

代码整洁之道-格式

对于代码的格式&#xff0c;每个人都有不同的代码风格&#xff0c;这没什么。但是对于一个团队来说&#xff0c;最好能够统一代码风格&#xff0c;在同一个项目中&#xff0c;如果到处充斥着不同的代码风格&#xff0c;相比读起来并不是那么让人舒适&#xff0c;比如在什么地方…

代码整洁之道-对象和数据结构

现在&#xff0c;有一个计算面积的需求&#xff0c;其中一种实现如下&#xff1a; class Square{public $side; } class Geometry{public function area($shape){if($shape instanceof Square){return $shape->side * $shape->side;}return 0;} }有人看了&#xff0c;你…

代码整洁之道-类

在面向对象的编程中&#xff0c;类是其中的基本单位&#xff0c;就像面向过程中的函数一样。所以在说类时&#xff0c;可以借鉴一下前面的函数&#xff0c;不如只做一件事&#xff0c;也就是所说的单一职责。 函数应该短小&#xff0c;对于类来说&#xff0c;也是这样。函数的…