脚本,程序--->自动抓取
万维网上信息的程序
。javascript
2.一、通用爬虫html
通用网络爬虫 是 捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,造成一个互联网内容的镜像备份。前端
2.一、聚焦爬虫java
是面向特定主题需求
的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于: *聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽可能保证只抓取与需求相关的网页信息。*python
搜索引擎的根基。作搜索引擎,必须使用爬虫。web
能够制做比较软件。ajax
在解决web项目问题时,流程以下:正则表达式
前端---> javascript---> python---> sql查询--->数据库redis
了解什么是Hash,会简单地使用MD5,SHA1等算法对数据进行Hash一遍存储算法
熟悉HTTP,HTTPS协议的基础知识,了解GET,POST方法,了解HTTP头中的信息,包括返回状态码,编码,user-agent,cookie,session等
能设置user-agent进行数据爬取,设置代理等
知道什么事Request,什么事response,会使用Fiddler等工具抓取及分析简单地网络数据包;对于动态爬虫,要学会分析ajax请求,模拟制造post数据包请求,抓取客户端session等信息,对于一些简单的网站,可以经过模拟数据包进行自动登陆。
对于一些难搞定的网站学会使用phantomjs+selenium抓取一些动态网页信息
并发下载,经过并行下载加速数据爬取;多线程的使用。
多线程就是利用计算机的cpu,使cpu的利用变高,使程序运行速度加快。
搜索引擎就是运行一些策略和算法,从互联网上获取网页信息,并将这些信息作一些处理以后保存起来,再为用户提供检索服务的一种程序或系统。
主要组成就是通用爬虫。
(1)、通用爬虫的定义
就是将互联网上的网页【总体】爬取下来,保存到本地的程序。
(2)、搜索引擎能够获取全部网页的缘由
搜索引擎经过不一样url将全部网页都保存到了本地。
(3)、搜索引擎网络爬虫的基本工做流程以下:
首先选取一部分的种子URL,将这些URL放入待抓取URL队列;
取出待抓取URL,解析DNS获得主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中,而且将这些URL放进已抓取URL队列。
分析已抓取URL队列中的URL,分析其中的其余URL,而且将URL放入待抓取URL队列,从而进入下一个循环....
(4)、探索引擎搜索url来源:
新网站会主动向搜索引擎提交本身的网址。
搜索引擎和dns解析商合做,若是有新网站注册,搜索引擎就能够获取网址。
可是搜索引擎蜘蛛的爬行是被输入了必定的规则的,它须要听从一些命令或文件的内容,如标注为nofollow
的连接,或者是Robots
协议。
Robots协议(也叫爬虫协议、机器人协议等),全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站经过Robots协议告诉搜索引擎哪些页面能够抓取,哪些页面不能抓取,例如:
(1)只能爬取原网页,可是通常网页中90%的内容都是无用的。
(2)不能知足不一样行业、不一样人员的不一样需求。
(3)只能获取文字,不能获取视频,音频,文件等内容。
(4)只能经过关键字查询,没法支持语义查询。
在实施网页抓取时,会对内容进行筛选,尽可能保证之抓取与需求相关的数据。
HTTP协议
(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。
HTTPS
(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。
SSL
(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络链接进行加密,保障在Internet上数据传输的安全。
HTTP
的端口号为80
HTTPS
的端口号为443
http的工做过程:
(1)地址解析:客户端解析出url的每个部分
(2)分装http请求数据包
(3)封装tcp数据包,经过三次握手创建tcp链接。
(4)客户端发送请求
(5)服务器发送响应。
(6)关闭tcp链接
http协议的特色:
基于应用层的协议。
无链接
在http1.0以前每次发送http都是单独链接,自从http1.1以后,只需设置一个请求头Connection,就能够作到一个长链接。
无状态。
http协议不记录状态,每次请求,若是想要到以前请求的内容,必须单独发送。为了解决这种问题,产生一种技术,就叫cookie和session。
HTTP通讯由两部分组成: 客户端请求消息 与 服务器响应消息
浏览器发送HTTP请求的过程:
Get
和Post
两种方式。URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其余资源的地址的一种标识方法。
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
python的urllib下的parse模块能够帮助咱们解析一个url
from urllib import parse url = 'https://localhost:9999/bin/index.html?usename=zhangsanY&password=123#bottom' parse_result = parse.urlparse(url) print(parse_result) print(parse_result.netloc) print(parse_result.path) 运行结果: ParseResult( scheme='https', netloc='localhost:9999', path='/bin/index.html', params='', query='usename=zhangsanY&password=123', fragment='bottom') localhost:9999 /bin/index.html
URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括如下格式:
请求行
、请求头部
、空行
、请求数据
四个部分组成,下图给出了请求报文的通常格式。
一个典型的HTTP请求示例
GET https://www.baidu.com/ HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://www.baidu.com/ Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; BDUSS=nF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdOd1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFaq3ldWqt5XN; H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=12314753; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0
HTTP请求主要分为Get
和Post
两种方法
http://www.baidu.com/s?wd=Chinese
注意:避免使用Get方式提交表单,由于有可能会致使安全问题。 好比说在登录表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。
一、Host (主机和端口号)
Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,一般属于URL的一部分。
二、Connection (连接类型)
Connection:表示客户端与服务链接类型
Connection:keep-alive
的请求,HTTP/1.1使用 keep-alive
为默认值。Connection:keep-alive
的响应,向同一个链接发送下一个请求,直到一方主动关闭链接。keep-alive在不少状况下可以重用链接,减小资源消耗,缩短响应时间,好比当浏览器须要多个文件时(好比一个HTML文件和相关的图形文件),不须要每次都去请求创建链接。
三、Upgrade-Insecure-Requests (升级为HTTPS请求)
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器再也不显示https页面中的http请求警报。
*HTTPS 是以安全为目标的 HTTP 通道,因此在 HTTPS 承载的页面上不容许出现 HTTP 请求,一旦出现就是提示或报错。*
四、User-Agent (客户端标识)
User-Agent:是客户浏览器的名称
五、Accept (传输文件类型)
Accept:指浏览器或其余客户端能够接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器能够根据它判断并返回适当的文件格式。
举例:
Accept: */*
:表示什么均可以接收。
Accept:image/gif
:代表客户端但愿接受GIF图像格式的资源;
Accept:text/html
:代表客户端但愿接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8
:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、全部的图像格式资源。
*q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于得到其“;”以前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则用于表示浏览器不接受此内容类型。*
***Text:用于标准化地表示的文本信息,文本消息能够是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。html文件类型
六、Referer (页面跳转处)
Referer:代表产生请求的网页来自于哪一个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性能够用来跟踪Web请求来自哪一个页面,是从什么网站来的等。
有时候遇到下载某网站图片,须要对应的referer,不然没法下载图片,那是由于人家作了防盗链,原理就是根据referer去判断是不是本网站的地址,若是不是,则拒绝,若是是,就能够下载;
7. Accept-Encoding(文件编解码格式)
Accept-Encoding:指出浏览器能够接受的编码方式。编码方式不一样于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应以后先解码,而后再检查文件格式,许多情形下这能够减小大量的下载时间。
**举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0**
若是有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回通过gzip编码的HTML页面。 若是请求消息中没有设置这个域服务器假定客户端对各类内容编码均可以接受。
8. Accept-Language(语言种类)
Accept-Langeuage:指出浏览器能够接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器可以提供一种以上的语言版本时要用到。
9. Accept-Charset(字符编码)
Accept-Charset:指出浏览器能够接受的字符编码。
举例:Accept-Charset:iso-8859-1,gb2312,utf-8
若是在请求消息中没有设置这个域,缺省是任何字符集均可以接受。
10. Cookie (Cookie)
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它能够记载和服务器相关的用户信息,也能够用来实现会话功能,之后会详细讲。
11. Content-Type (POST数据类型)
Content-Type:POST请求里用来表示的内容类型。
举例:Content-Type = Text/XML; charset=gb2312:
指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。
12. content-length (POST数据长度)
post请求的请求数据的长度
13. x-requested-with:xmlhttprequest--xhr
当咱们发送一个ajax接口数据,想要获取数据内容,必须封装这个头,这个头就表示这个请求是一个ajax。
HTTP响应也由四个部分组成,分别是: 状态行
、消息报头
、空行
、响应正文
HTTP/1.1 200 OK Server: Tengine Connection: keep-alive Date: Wed, 30 Nov 2016 07:58:21 GMT Cache-Control: no-cache Content-Type: text/html;charset=UTF-8 Keep-Alive: timeout=20 Vary: Accept-Encoding Pragma: no-cache X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395 Content-Length: 180945 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ....
一、Cache-Control:must-revalidate, no-cache, private。
这个值告诉客户端,服务端不但愿客户端缓存资源,在下次请求资源时,必需要重新请求服务器,不能从缓存副本中获取资源。
二、 Connection:keep-alive
这个字段做为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp链接也是一个长链接,客户端能够继续使用这个tcp链接发送http请求。
三、Content-Encoding:gzip
告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
4.、Content-Type:text/html;charset=UTF-8
告诉客户端,资源文件的类型,还有字符编码,客户端经过utf-8对资源进行解码,而后对资源进行html解析。一般咱们会看到有些网站是乱码的,每每就是服务器端没有返回正确的编码。
五、 Date:Sun, 21 Sep 2016 06:18:21 GMT
这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不一样时区在相互请求资源的时候,时间混乱问题。
六、 Expires:Sun, 1 Jan 2000 01:00:00 GMT
这个响应头也是跟缓存有关的,告诉客户端在这个时间前,能够直接访问缓存副本,很显然这个值会存在问题,由于客户端和服务器的时间不必定会都是相同的,若是时间不一样就会致使问题。因此这个响应头是没有Cache-Control:max-age=*这个响应头准确的,由于max-age=date中的date是个相对时间,不只更好理解,也更准确。
七、 Pragma:no-cache
这个含义与Cache-Control等同。
八、Server:Tengine/1.4.6
这个是服务器和相对应的版本,只是告诉客户端服务器的信息。
九、Transfer-Encoding:chunked
这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。通常分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,因此采用分块发送,每一块都是独立的,独立的块都能标示本身的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就能够肯定资源已经传输完了。
十、Vary: Accept-Encoding
告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,如今这个字段用处并不大,由于如今的浏览器都是支持压缩的。
Cookie 和 Session:
服务器和客户端的交互仅限于请求/响应过程,结束以后便断开,在下一次请求时,服务器会认为新的客户端。
为了维护他们之间的连接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:经过在 客户端 记录的信息肯定用户的身份。
Session:经过在 服务器端 记录的信息肯定用户的身份。
响应状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
常见状态码:
100~199
:表示服务器成功接收部分请求,要求客户端继续提交其他请求才能完成整个处理过程。200~299
:表示服务器成功接收请求并已完成整个处理过程。经常使用200(OK 请求成功)。300~399
:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、经常使用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。400~499
:客户端的请求有错误,经常使用404(服务器没法找到被请求的页面)、403(服务器拒绝访问,权限不够)。500~599
:服务器端出现错误,经常使用500(请求未完成。服务器遇到不可预知的状况)。http://www.javashuo.com/article/p-zikdnfpi-ct.html
HTTP响应状态码参考:
1xx:信息 100 Continue 服务器仅接收到部分请求,可是一旦服务器并无拒绝该请求,客户端应该继续发送其他的请求。 101 Switching Protocols 服务器转换协议:服务器将听从客户的请求转换到另一种协议。 2xx:成功 200 OK 请求成功(其后是对GET和POST请求的应答文档) 201 Created 请求被建立完成,同时新的资源被建立。 202 Accepted 供处理的请求已被接受,可是处理未完成。 203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,由于使用的是文档的拷贝。 204 No Content 没有新文档。浏览器应该继续显示原来的文档。若是用户按期地刷新页面,而Servlet能够肯定用户文档足够新,这个状态代码是颇有用的。 205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。 3xx:重定向 300 Multiple Choices 多重选择。连接列表。用户能够选择某连接到达目的地。最多容许五个地址。 301 Moved Permanently 所请求的页面已经转移至新的url。 302 Moved Temporarily 所请求的页面已经临时转移至新的url。 303 See Other 所请求的页面可在别的url下被找到。 304 Not Modified 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(通常是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还能够继续使用。 305 Use Proxy 客户请求的文档应该经过Location头所指明的代理服务器提取。 306 Unused 此代码被用于前一版本。目前已再也不使用,可是代码依然被保留。 307 Temporary Redirect 被请求的页面已经临时移至新的url。 4xx:客户端错误 400 Bad Request 服务器未能理解请求。 401 Unauthorized 被请求的页面须要用户名和密码。 401.1 登陆失败。 401.2 服务器配置致使登陆失败。 401.3 因为 ACL 对资源的限制而未得到受权。 401.4 筛选器受权失败。 401.5 ISAPI/CGI 应用程序受权失败。 401.7 访问被 Web 服务器上的 URL 受权策略拒绝。这个错误代码为 IIS 6.0 所专用。 402 Payment Required 此代码尚没法使用。 403 Forbidden 对被请求页面的访问被禁止。 403.1 执行访问被禁止。 403.2 读访问被禁止。 403.3 写访问被禁止。 403.4 要求 SSL。 403.5 要求 SSL 128。 403.6 IP 地址被拒绝。 403.7 要求客户端证书。 403.8 站点访问被拒绝。 403.9 用户数过多。 403.10 配置无效。 403.11 密码更改。 403.12 拒绝访问映射表。 403.13 客户端证书被吊销。 403.14 拒绝目录列表。 403.15 超出客户端访问许可。 403.16 客户端证书不受信任或无效。 403.17 客户端证书已过时或还没有生效。 403.18 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。 403.19 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。 403.20 Passport 登陆失败。这个错误代码为 IIS 6.0 所专用。 404 Not Found 服务器没法找到被请求的页面。 404.0 没有找到文件或目录。 404.1 没法在所请求的端口上访问 Web 站点。 404.2 Web 服务扩展锁定策略阻止本请求。 404.3 MIME 映射策略阻止本请求。 405 Method Not Allowed 请求中指定的方法不被容许。 406 Not Acceptable 服务器生成的响应没法被客户端所接受。 407 Proxy Authentication Required 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 408 Request Timeout 请求超出了服务器的等待时间。 409 Conflict 因为冲突,请求没法被完成。 410 Gone 被请求的页面不可用。 411 Length Required "Content-Length" 未被定义。若是无此内容,服务器不会接受请求。 412 Precondition Failed 请求中的前提条件被服务器评估为失败。 413 Request Entity Too Large 因为所请求的实体的太大,服务器不会接受请求。 414 Request-url Too Long 因为url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种状况。 415 Unsupported Media Type 因为媒介类型不被支持,服务器不会接受请求。 416 Requested Range Not Satisfiable 服务器不能知足客户在请求中指定的Range头。 417 Expectation Failed 执行失败。 423 锁定的错误。 5xx:服务器错误 500 Internal Server Error 请求未完成。服务器遇到不可预知的状况。 500.12 应用程序正忙于在 Web 服务器上从新启动。 500.13 Web 服务器太忙。 500.15 不容许直接请求 Global.asa。 500.16 UNC 受权凭据不正确。这个错误代码为 IIS 6.0 所专用。 500.18 URL 受权存储不能打开。这个错误代码为 IIS 6.0 所专用。 500.100 内部 ASP 错误。 501 Not Implemented 请求未完成。服务器不支持所请求的功能。 502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。 502.1 CGI 应用程序超时。 · 502.2 CGI 应用程序出错。 503 Service Unavailable 请求未完成。服务器临时过载或当机。 504 Gateway Timeout 网关超时。 505 HTTP Version Not Supported 服务器不支持请求中指明的HTTP协议版本
定义:网络爬虫排除标准
做用:告诉搜索引擎哪些能够爬哪些不能爬。
网站地图,能够帮助咱们了解一个网站的结构。
site:www.taobao.com
Hash :散列,经过关于键值(key)的函数,将数据映射到内存存储中一个位置来访问。这个过程叫作Hash,这个映射函数称作散列函数,存放记录的数组称作散列表(Hash Table),又叫哈希表。
简单地说,它是密码学中的一个重要的函数,通常以 表示 。这个函数能够将任意一段数据(通常称这段数据为“消息”)压缩成固定长度的字符串(通常称输出的字符串为“摘要”)。哈希函数须要知足下述条件:
先分类,再查找,经过计算,缩小范围,加快查找速度
数字签名:给数据打指纹
好比咱们下载一个文件,文件的下载过程当中会通过不少网络服务器、路由器的中转,如何保证这个文件就是咱们所须要的呢?咱们不可能去一一检测这个文件的每一个字节,也不能简单地利用文件名、文件大小这些极容易假装的信息,这时候,咱们就须要一种指纹同样的标志来检查文件的可靠性,这种指纹就是咱们如今所用的Hash算法(也叫散列算法)。
密码存储
在用户进行网站登陆时,若是服务器直接存储用户密码,则若是服务器被攻击者所攻击,用户的密码就会遭到泄露。最典型的事件就是CSDN的密码明文存储事件了。为了解决这个问题,服务器能够仅存储用户密码的哈希结果。当用户输入登陆信息后,服务器端能够计算密码的哈希结果,并与存储的哈希结果进行对比,若是结果相同,则容许用户登陆。因为服务器不直接存储用户密码,所以即便服务器被攻击者攻击,用户的密码也不会被泄露。这也是为何咱们在使用【找回密码】功能时,服务器直接请求输入新的密码,而不是把原始密码发送给咱们。
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不一样。
冲突避免:很难找到两段内容不一样的明文,使得它们的 hash 值一致(发生冲突)。
即对于任意两个不一样的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。因此由于他的不可逆性,hash算法经常用来给一些信息加密,由于这种不可逆性,你不只不可能根据一段经过散列算法获得的指纹来得到原有的文件,也不可能简单地创造一个文件并让它的指纹与一段目标指纹相一致。
(1)直接定值法:取Key或者Key的某个线性函数值为散列地址。
(2)数字分析法:须要知道Key的集合,而且Key的位数比地址位数多,选择Key数字分布均匀的位。
Hash(Key) 取六位: 列数 : 1 (2) 3 (4) 5 (6) (7) 8 (9) 10 11 12 (13) key1: 5 2 4 2 7 5 8 5 3 6 5 1 3 key2: 5 4 4 8 7 7 7 5 4 8 9 5 1 key3: 3 1 5 3 7 8 5 4 6 3 5 5 2 key4: 5 3 6 4 3 2 5 4 5 3 2 6 4 其中(二、四、六、七、九、13) 这6列数字无重复,分布较均匀,取此六列做为Hash(Key)的值。 Hash(Key1) :225833 Hash(Key2):487741 Hash(Key3):138562 Hash(Key4):342554
(3)平方取中法:取Key平方值的中间几位做为Hash地址。
(4)折叠法:将关键字分割成位数相同的几部分(最后一部分的位数能够不一样),而后 取这几部分的叠加和(舍去进位)做为哈希地址。 当Key的位数较多的时候数字分布均匀适合采用这种方案.
(5)随机数法:伪随机探测再散列。
具体实现:创建一个伪随机数发生器,Hash(Key) = random(Key). 以此伪随机数做为哈希地址。
(6)除留余数法:取关键字被某个除数 p 求余,获得的做为散列地址。
即 H(Key) = Key % p;
目前流行的 Hash 算法包括 MD五、SHA-1 和 SHA-2。
SHA (Secure Hash Algorithm)是一个 Hash 函数族,由 NIST(National Institute of Standards and Technology)于 1993 年发布第一个算法。目前知名的 SHA-1 在 1995 年面世,它的输出为长度 160 位的 hash 值,所以抗穷举性更好。SHA-1 设计时基于和 MD4 相同原理,而且模仿了该算法。SHA-1 已被证实不具”强抗碰撞性”。
为了提升安全性,NIST 还设计出了 SHA-22四、SHA-25六、SHA-384,和 SHA-512 算法(统称为 SHA-2),跟 SHA-1 算法原理相似。SHA-3 相关算法也已被提出。
若是两个key经过hash函数处理以后获得的散列值相同,这种状况就叫作散列算法的碰撞(collision)。
现代散列算法所存在的理由就是,它的不可逆性能在较大几率上获得实现,也就是说,发现碰撞的几率很小,这种碰撞能被利用的几率更小。
(1) MD5碰撞案例
import hashlib # 两段HEX字节串,注意它们有细微差异 a = bytearray.fromhex("0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef") b = bytearray.fromhex("0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef") # 输出MD5,它们的结果一致 print(hashlib.md5(a).hexdigest()) print(hashlib.md5(b).hexdigest())
这样的例子还有不少。所以,MD5在数年前就已经不被推荐做为应用中的散列算法方案,取代它的是SHA家族算法,也就是安全散列算法(Secure Hash Algorithm,缩写为SHA)。
(2) SHA家族算法以及SHA1碰撞
SHA家族算法的种类不少,有SHA0、SHA一、SHA25六、SHA384等等,它们的计算方式和计算速度都有差异。其中SHA1是如今用途最普遍的一种算法。包括GitHub在内的众多版本控制工具以及各类云同步服务都是用SHA1来区别文件,不少安全证书或是签名也使用SHA1来保证惟一性。长期以来,人们都认为SHA1是十分安全的,至少你们尚未找到一次碰撞案例。
hash在知乎上的一遍经典文章:https://www.zhihu.com/question/56234281/answer/148349930