hash函数

邻居子系统 之 邻居项查找neigh_lookup、___neigh_lookup_noref

a 夏天 提交于 2019-12-02 16:42:34
概述 邻居项查找是通过neigh_lookup相关函数来进行的; ___neigh_lookup_noref,该函数根据输出设备和主键值(IPv4为下一跳ip地址)在邻居项hash表中查找,找到则返回该项; neigh_lookup,该函数调用了___neigh_lookup_noref函数,并且在找到邻居项之后,进行引用计数的递增,然后返回该项; 源码分析 1 struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey, 2 struct net_device *dev) 3 { 4 struct neighbour *n; 5 6 NEIGH_CACHE_STAT_INC(tbl, lookups); 7 8 rcu_read_lock_bh(); 9 10 /* 非引用查找邻居项 */ 11 n = __neigh_lookup_noref(tbl, pkey, dev); 12 13 /* 增加引用计数 */ 14 if (n) { 15 if (!atomic_inc_not_zero(&n->refcnt)) 16 n = NULL; 17 NEIGH_CACHE_STAT_INC(tbl, hits); 18 } 19 20 rcu_read_unlock_bh(); 21 22 /

散列表(上)——开放定址法

限于喜欢 提交于 2019-12-02 15:29:55
概述 散列表,又称哈希表,hash表。散列表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于散列表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。 设计思想 Hash表采用一个映射函数 f : key —> address 将关键字映射到该记录在表中的存储位置,从而在想要查找该记录时,可以直接根据关键字和映射关系计算出该记录在表中的存储位置,通常情况下,这种映射关系称作为Hash函数,而通过Hash函数和关键字计算出来的存储位置(注意这里的存储位置只是表中的存储位置,并不是实际的物理地址)称作为Hash地址。 哈希函数 1)直接定址法 取关键字或者关键字的某个线性函数为Hash地址,即Hash(key)=a*key+b 2)除留余数法 如果知道Hash表的最大长度为m,可以取不大于m的最大质数p,然后对关键字进行取余运算,Hash(key)=key%p。 在这里p的选取非常关键,p选择的好的话,能够最大程度地减少冲突,p一般取不大于m的最大质数。 3)平方取中法 对关键字进行平方运算,然后取结果的中间几位作为Hash地址。假如有以下关键字序列{421,423,436},平方之后的结果为{177241,178929

高性能可扩展mysql 笔记(三)Hash分区、RANGE分区、LIST分区

眉间皱痕 提交于 2019-12-02 14:36:21
一、MySQL分区表操作 1、定义 :数据库表分区是数据库基本设计规范之一,分区表在物理上表现为多个文件,在逻辑上表现为一个表; 2、表分区的弊端 : 要谨慎选择分区键,错误的操作可能导致跨分区查询效率降低。 建议 采用物理分表的方式管理大数据。 3、确认MySQL服务器是否支持分区表 使用 SHOW PLUGINS;在mysql命令行查看是否具有分区表的功能: ​ 查询结果中的"partition | ACTIVE | STORAGE ENGINE | NULL | GPL "这一行代表当前数据库可以进行数据库分区表操作。 4、普通数据库表的物理结构与分区表的物理结构的区别: ​ 左边为普通表的物理结构,右边为分区后的数据库表物理结构。 一、Hash分区表 (按HASH分区) 1、HASH分区的特点 根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中,使数据可以平均的分布在各个分区中。 注意: HASH分区的键值必须是一个INT类型的值,或是通过函数可以转为INT类型。 2、创建HASH分区: use hash; CREATE TABLE `hash`.`customer_login_log`( customer_id int UNSIGNED not null, login_time TIMESTAMP, login_ip int UNSIGNED, login

哈希算法及其拓展

六月ゝ 毕业季﹏ 提交于 2019-12-02 12:14:32
本篇是iOS逆向开发的递进篇-关于哈希算法、数字签名及对称加密等,下面我们着重讲解此内容,希望对大家有所帮助!!! 一、哈希 1.1 基本内容 哈希表也称为散列表(Hash table),是根据关键码值(key,value),直接进行访问的数据结构。通过把关键码映射到表中的一个位置来进行访问记录,用来加快查找速度。映射函数也称之为散列函数,存放记录数组称为散列表。 假设没有内存限制,直接可以将键作为数组的索引,那么所有的查找仅仅需要一次即可完成。但是这种理想的情况也不会一直出现,因为牵扯到内存问题。从另一个角度来说,如果没有时间来限制,我们也可以使用无序数组并进行顺序查找,这样也会使用较少的内存。 使用哈希查找算法分为两个步骤: 使用Hash函数将被要查找的键转化为数组中的一个索引。理想情况下,不同的键都可以转为不同的索引值。但这仅仅是理想情况下,在实际的开发运算中,我们还是要处理两个或者多个键值散列到同个索引值的情况。 要处理碰撞冲突的过程。 目前本人博客关于讲述哈希思想查找元素的博客有: https://www.cnblogs.com/guohai-stronger/p/11506990.html ,还会持续更新此类算法思想有关的题目。 1.2 哈希函数的两种解决碰撞的方式 1.2.1 拉链法(separate chaining) 拉链法简单说就是链表+数组

深入理解HashMap和CurrentHashMap

懵懂的女人 提交于 2019-12-02 09:30:11
原文链接: https://segmentfault.com/a/1190000015726870 前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。 HashMap 众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。 Base 1.7 1.7 中的数据结构图: 先来看看 1.7 中的实现。 这是 HashMap 中比较核心的几个成员变量;看看分别是什么意思? 初始化桶大小,因为底层是数组,所以这是数组默认的大小。 桶最大值。 默认的负载因子(0.75) table 真正存放数据的数组。 Map 存放数量的大小。 桶大小,可在初始化时显式指定。 负载因子,可在初始化时显式指定。 重点解释下负载因子: 由于给定的 HashMap 的容量大小是固定的,比如默认初始化: 1 public HashMap() { 2 this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); 3 } 4 5 public HashMap(int initialCapacity

HashMap源码分析

青春壹個敷衍的年華 提交于 2019-12-02 08:39:38
什么是HashMap 可以拆开理解,即Hash+Map,HashMap是一个存储键值对的数据结构的一种实现,通过对键作hash索引对键值对进行存取操作。由每一个键值作hash索引后,在HashMap中的存储位置是不尽相同的(会有两个键值不同,但hash值相同的情况),所以在HashMap中存储的数据是无序的,且对于键的值而言是不重复的 什么是Hash Hash散列将一个任意长度的值通过hash函数算法,转换成一个固定的值 Java中的hash函数算法用移位去实现,如下是jdk1.7中HashMap的hash函数 /** * Retrieve object hash code and applies a supplemental hash function to the * result hash, which defends against poor quality hash functions. This is * critical because HashMap uses power-of-two length hash tables, that * otherwise encounter collisions for hashCodes that do not differ * in lower bits. Note: Null keys always map to hash

使用python来操作redis用法详解

女生的网名这么多〃 提交于 2019-12-02 08:15:51
使用python来操作redis用法详解 1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。 redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。同理,python的redis没有实现select命令。 安装redis pip install redis 连接redis,加上decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。 import redis # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库 r = redis.Redis(host='localhost', port=6379, decode_responses=True) # host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379 r.set('name', 'junxi') # key是"foo" value是"bar"

hash table

拟墨画扇 提交于 2019-12-02 06:58:43
Hash Table,叫做哈希表,也叫做散列表。 概念:通过某种对应关系h,使得每一个元素和储存位置一一对应。这种对应关系称为哈希函数。它最大的优点就是插入、搜索和删除得很快(O(1))。 碰撞(Collision):不同的关键字对应同一个哈希地址 解决碰撞的方法之一:chaining 拉链法(open hashing)H-Chaining 比如expected number of comparisons==2 那chain长度为3 单双向链表不确定,看情况。 另外头指针用数组存。 开地址法(closed hashing或者opened addressing)线性探测 H-OPEN 即当一个关键字和另一个关键字发生冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,当碰到一个空的单元时,则插入其中。比较常用的探测方法有线性探测法,比如有一组关键字{12,13,25,23,38,34,6,84,91},Hash表长为14,Hash函数为address(key)=key%11,当插入12,13,25时可以直接插入,而当插入23时,地址1被占用了,因此沿着地址1依次往下探测(探测步长可以根据情况而定),直到探测到地址4,发现为空,则将23插入其中。 https://blog.csdn.net/yue_hu/article/details

mysql 索引基本概念

人盡茶涼 提交于 2019-12-02 06:28:51
1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询. 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序,原理同上. hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测. AAAA 和 AAAAB 的索引没有相关性. hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件

Map随笔:最常用的Map——HashMap

╄→尐↘猪︶ㄣ 提交于 2019-12-02 05:59:58
目录 Map随笔:最常用的Map——HashMap 前言: 1,HashMap的一些属性(JDK8) 2,HashMap的构造函数(JDK8) 3,HashMap的一些方法(JDK8) Map随笔:最常用的Map——HashMap 前言: ​ HashMap作为我们工作中最常用的一个容器,去了解它的一些原理是非常有必要的,同时,HashMap也是面试中被问起的常客。所以接下来我就源码并穿插一些面试中最常被问起的面试题和大家分享一下HashMap相关的知识来避免以后在面试中再被HashMap相关知识所难住。 1,HashMap的一些属性(JDK8) 先看看源码中的几个常量属性 /** * 默认的数组容量 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * 最大的数组容量 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * 默认加载因子值 */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * java8优化了HashMap的数据结构,在链上的结构数据超过固定数量便会从链表转换成红黑树存储 * 链表转树的默认值 8 */ static final int TREEIFY