hash函数

BTree、B+Tree和HASH索引

落爺英雄遲暮 提交于 2019-12-22 10:08:13
  hash索引的特点是检索效率非常高,检索一次就可以定位,BTree需要从根节点往下查找,经过多次IO访问才能找到结果,所以hash索引的效率远高于BTree。 但hash自身也有很多局限与缺陷: 1.hash只能通过索引精准定位目标,而不能进行范围查询。 2.因为hash只保存了经过hash计算之后的hash值和对应的行指针,所以无法用于排序。 3.hash索引如果遇到大量hash值相等的情况,那么大量的记录指针信息会存于同一个hash值上,这样要定位一条记录时就会很麻烦,最终效率不一定会比BTree索引高。 4.对于组合索引,hash索引会把组合索引合并一起后再计算hash值,而不是各自单独计算hash值,所以通过组合索引前面几个索引键值时,hash索引无法使用。 5.因为不同索引键有可能存在相同的hash值,所以hash索引任何时候都不能避免全表扫描。 BTree又叫平衡多路查找树。一棵m阶的B 树 (m叉树)的特性如下: 1.树中每个结点最多含有m个孩子(m>=2); 2.除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数); 3.若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点); 4.所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息 5.

哈希Hash定义

醉酒当歌 提交于 2019-12-20 00:10:26
Hash,一般翻译做"散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系 MD5就可以说是目前应用最广泛的Hash算法 Hash算法在信息安全方面的应用主要体现在以下的3个方面: 1) 文件校验 我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。 2) 数字签名 Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要

python——魔术方法

北城余情 提交于 2019-12-18 21:38:50
一、常用魔术方法 1.del 销毁魔术方法 触发时机:当一个对象在内存中被销毁的时候自动执行 参数:至少有一个self,接收对象 返回值:无 作用:在对象销毁的时候做一些操作 注意:程序自动调用此方法,不需要我们手动调用。 class Cat: def __init__(self,name): self.name=name print("{}来了".format(self.name)) #对象在销毁时执行 def __del__(self): print("{}走了".format(self.name)) cat=Cat("tom") # del cat print("程序结束")`` 结果: tom来了 程序结束 tom走了 2.call call():可以让类的实例具有类似于函数的行为, 进一步模糊了函数和对象之间的概念。 使用方式: 对象后面加括号,触发执行。 即:对象() 或者 类()() class Person : def __init__ ( self ) : pass def eat ( self ) : print ( "吃。。。" ) def __call__ ( self , num ) : he = 0 for i in range ( 1 , num + 1 ) : he += i print ( he ) person = Person ( )

并发容器之ConcurrentHashMap

邮差的信 提交于 2019-12-18 13:52:12
  JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开 始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、 Collections.synchronizedXxx()同步容器等相比,util.concurrent中引入的并发容器主要解决了两个问题: 1)根据具体场景进行设计,尽量避免synchronized,提供并发性。 2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。   util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。   下面是对并发容器的简单介绍:   ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的时候锁住了所有的段

PHP 之sha256 sha512封装

懵懂的女人 提交于 2019-12-18 12:04:39
PHP 之sha256 sha512封装 /* PHP sha256 sha512目前(PHP 7.1)没有内置的函数来计算,sha1() sha1_file() md5() md5_file()分别可以用来计算字符串和文件的sha1散列值和md5散列值,当前最新版本PHP 7.1 sha256() sha256_file() sha512() sha512_file()这样的函数也没有。SHA-2是SHA-224、SHA-256、SHA-384,和SHA-512的合称。 PHP 计算sha256 sha512可以使用hash()函数实现,计算文件的sha256 sha512则可以使用hash_file()实现。 hash($algo , $data, $rawOutput); hash_file($algo , $filepath, $rawOutput); 其中$algo是算法,可以是sha256, sha512等值,支持的算法可以使用hash_algos()查看,该函数返回所有支持的算法。 $data是需要计算hash值的字符串,$filepath是需要计算hash值的文件名,可以是相对路径也可以是绝对路径。 $rawOutput是一个可选的布尔值参数,如果为true,则返回二进制数据,如果为false则返回字符串,默认值为false. 我们可以封装自定义函数来实现PHP

五分钟理解一致性哈希算法(consistent hashing)

喜你入骨 提交于 2019-12-18 10:32:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、 平衡性(Balance) :平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。 2、 单调性(Monotonicity) :单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 3、 分散性(Spread) : 在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可 能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不 同缓冲中去,降低了系统存储的效率

五分钟理解一致性哈希算法(consistent hashing)

不羁的心 提交于 2019-12-18 10:19:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 简介: 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 平衡性(Balance): 平衡性是指 哈希的结果能够尽可能分布到所有的缓冲中去 ,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。 单调性(Monotonicity): 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够 保证原有已分配的内容可以被映射到原有的或者新的缓冲中去 ,而不会被映射到旧的缓冲集合中的其他缓冲区。 分散性(Spread): 在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去, 降低了系统存储的效率

Trie树的基本原理及应用

狂风中的少年 提交于 2019-12-18 04:31:43
前言 理论知识 [什么是 Trie 树](#什么是 trie 树) [Trie 的优劣势](#trie 的优劣势) [Trie 的应用场景](#trie 的应用场景) 编码实现 参考文章 联系我 前言 在做用户 query 理解的过程中,有许多需要使用词典来"识别"的过程。在此期间,就避免不了使用 Trie 树这一数据结构。 因此今天我们来深入的学习一下 Trie 树相关的理论知识,并且动手编码实现。 理论知识 什么是 Trie 树 下面的定义引自维基百科。 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 一个简单的 Trie 结构如下图所示: 从上面的图中,我们可以发现一些 Trie 的特性。 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,就是该节点对应的字符串。 每个单词的公共前缀作为一个字符节点保存。 通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字), 或者存储一些其他相关的值。

Java HashMap的put操作(Java1.8)

孤街浪徒 提交于 2019-12-17 09:04:16
https://www.cnblogs.com/JzedyBlogs/p/10208295.html 写得非常好: 这个是Java1.8 -------------------------------- 1 public V put(K key, V value) { 2 return putVal(hash(key), key, value, false, true); 3 } 4 5 static final int hash(Object key) {//hash函数,用于索引定位 6 int h; 7 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 8 } 9 10 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 11 boolean evict) { 12 Node<K,V>[] tab; Node<K,V> p; int n, i; 13 if ((tab = table) == null || (n = tab.length) == 0) 14 n = (tab = resize()).length;//存储数据Node没有初始化,此时初始化 15 if ((p = tab[i = (n - 1) & hash])

【计算机笔记】Java 符号表

感情迁移 提交于 2019-12-17 03:01:31
前言 初级实现 1. 链表实现无序符号表 2. 二分查找实现有序符号表 二叉查找树 1. get() 2. put() 3. 分析 4. floor() 5. rank() 6. min() 7. deleteMin() 8. delete() 9. keys() 10. 分析 2-3 查找树 1. 插入操作 2. 性质 红黑树 1. 左旋转 2. 右旋转 3. 颜色转换 4. 插入 5. 分析 散列表 1. 散列函数 2. 拉链法 3. 线性探测法 小结 1. 符号表算法比较 2. Java 的符号表实现 3. 稀疏向量乘法 前言 符号表(Symbol Table)是一种存储键值对的数据结构,可以支持快速查找操作。 符号表分为有序和无序两种,有序符号表主要指支持 min()、max() 等根据键的大小关系来实现的操作。 有序符号表的键需要实现 Comparable 接口。 public interface UnorderedST < Key , Value > { int size ( ) ; Value get ( Key key ) ; void put ( Key key , Value value ) ; void delete ( Key key ) ; } public interface OrderedST < Key extends Comparable <