history:不带#/ 利用html5 的 history.pushState API 来完成URL跳转,而无需重新加载页面 好看 正常的URL http://user/id
hash:带#/ 通过锚点值来实现的路由跳转
区别:
2.hash 采用的是通过锚点值来实现的路由跳转,history 模式 采用html5 的 history.pushState API 来完成URL跳转
3.history模式 需要后端配合,因为刷新页面 会404
4.hash模式 支持IE 7、8,history模式 支持IE 10
https 加密整个过程。为啥使用hash(转)
现在网络中比较常见的哈希数值计算方式有两种,一种是MD5方式,另一种是SHA1方式。目前只有通过MD5这种方式计算出的结果,才可以成功转换为磁性链接信息。所以我们首先下载运行“MD5-Hash哈希值计算工具”这款软件,接着点击窗口下方“校验类型”中的“MD5”选项。然后点击“计算文件哈希值”按钮,在弹出的对话框中选择需要传递的文件。很快就可以在软件的“哈希值”里面,看到计算出来的哈希数值了(图1)。
默认情况下计算出的哈希数值是32位的,但是转换为磁性链接的哈希数值必须是40位的。这里就涉及到一个数值转换问题。首先我们将数值转换为16位的哈希数值,这个转换方法倒是非常简单。只需要将32位的哈希数值前后八位掐头去尾,剩下的就是16位的哈希数值了。比如32位的哈希数值为B7FCE0CE2229E2A289D3E6816D26D507,那么它的16位哈希数值就是2229E2A289D3E681。而40位哈希数值的转换方式为,16位的哈希数值加上32位哈希数值的后8位,再加上32位哈希数值的后16位即可。通过这样的计算就可以得到40位哈希数值,本例的结果为:2229E2A289D3E6816D26D50789D3E6816D26D507。
转换为磁性链接内容
既然现在已经有了哈希数值的内容,接下来我们就可以将其转换成磁性链接了。首先下载运行HashToMagnet这款工具,将刚刚转换出来的哈希数值信息粘贴到窗口中(图2)。如果转换的哈希数值比较多,那么一行粘贴一个哈希数值就可以了。接着点击工具栏中的“哈希→磁力链接”按钮,然后在弹出的对话框中点击“转换”按钮(图3)。
当工具提示转换完成后关闭转换对话框,在软件的窗口里面就可以看到转换成功后的磁性链接信息。将得到的磁性链接信息通过微博、微信等方式发布出去,这样其他网友就可以获取到我们发布的相关文件了。
最后,网友无论是在百度云等云存储里面,还是在迅雷等下载软件里面,只需要粘贴上这段磁性链接的信息,软件就会自动下载对应的BT种子,然后再利用BT的方式下载传递的文件。
window.location.href和window.location.hash的区别
1.浏览器将自己支持的一套加密规则发送给网站。
2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3.浏览器获得网站证书之后浏览器要做以下工作:
a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
c) 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4.网站接收浏览器发来的数据之后要做以下的操作: a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。 b)
使用密码加密一段握手消息,发送给浏览器。
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
------文章取自网络,时间太久了没找到原出处
Hash冲突的解决方法
(1)window.location.href
得到和使用的是完整的url,比如window.location.href="www.baidu.com”表示的是重新定向,页面跳转
到新的页面。也可以通过window.location.href得到a标签的完整的href,比如<a href="#book">如果使用href,那
么可以得到完整的链接(url)
(2)window.location.hash
得到的是锚链接。相比如href,通过window.location.hash并不会跳转到新的链接,只会在当前链接里面
改变锚链。并且如果有<a href="#book">通过window.location.hash得不到完整的链接(URL),仅仅得到#book.
哈希非哈希区别在于关键字在表中位置和它之间是否存在一个确定关系,哈希存在,非哈希不存在。
hash就是散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,输出就是散列值,该转换是压缩转换,散列值空间远小于输入的空间,不同的输入可能会散列成相同的输出。
Hash冲突,也就是经过一个函数结果作为地址去存放当前key value键值对(这个是hashmap存值方式)。
解决hash冲突发方法有
1)开放定址法,m为表长度,增量di有三种取法,线性探测再散列,平方探测再散列。
2)链地址法,就是key值取模再运算,java的HashMap就是这么实现的,在put()方法里面。
3)重哈希法,在创建hashmap的时候一般默认初始化容量,创建的hash表是桶的数量,负载因子:map的size/初始化容量,当hash表中负载因子达到负载极限,hash表会自动成倍增加容量,并将原有的对象重新分配加入新的值,成为rehash,rehash非常影响性能,所以初始化容量要设置好,不能太过浪费空间,也不能过小造成rehash情况经常出现。
4)建立一个公共溢出区域,就是把冲突的都放在另一个地方,不在表里面。
先看HashMap的数据结构,HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它通过计算散列码来决定存储的位置,HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,出来的hash值一样,不同对象出来的hash值一样,出现所谓hash冲突,HashMap底层通过链表解决hash冲突的。
HashMap其实就是一个Entry数组(类似pair),Entry对象中包含了链和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表。
在Java8之前,如果发生hash冲突往往是将该value直接链接到该位置的其他所有value的头部,即相互冲突的所有value形成一个链表,因此,最坏情况HashMap的查找时间复杂度退化到O(n),在Java8中做了改进,一个是改头插法为尾插法,还有一个是当一个位置冲突过多时(大于等于8),存储的value将形成一排序二叉树,排序的依据为key的hashCode,这样在最坏情况下,性能也只退化到O(logn)。
这样的改进意义重大,一是从O(n)提升到O(logn)的时间开销(最坏情况),二是如果恶意程序知道我们利用的Hash算法,在纯链表情况下,发送大量请求导致hash碰撞,不停访问这些key使HashMap忙于查找,最终瘫痪。
以上就是关于路由模式(hash、history)全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!