hash函数

C++——散列(hash)

强颜欢笑 提交于 2020-02-28 05:40:45
散列(hash) : 将元素通过一个函数 转换为整数 ,使得该整数可以尽量 唯一 地代表这个元素。 例如,在仅出现"A"~"Z"的字符串就可以通过hash(26*26*26)将 字符型 数据转换为 整型 数据,并且数据 不会发生重复 。代码如下: # include <iostream> using namespace std ; # define MAX 5 //输入数据的数量 int getid ( char * id ) { //将长度为3的字符串转换为整型存储 int i_id = 0 ; for ( int i = 0 ; i < 3 ; i ++ ) i_id = 26 * i_id + ( id [ i ] - 'A' ) ; return i_id ; } int main ( ) { //使用(散列)hash(26*26*26)将字符型数据转换为整型数据 const int maxn = 26 * 26 * 26 ; int s [ maxn ] , i_id ; char c_id [ MAX ] [ 3 ] ; for ( int i = 0 ; i < MAX ; i ++ ) { cin >> c_id [ i ] ; //输入字符型数据 i_id = getid ( c_id [ i ] ) ; //将字符型转换为整型 s [ i ] = i_id ;

干货分享,值得收藏:搞懂这些redis知识点,还怕干不过面试官?

爷,独闯天下 提交于 2020-02-28 00:49:45
是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义。redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们按照合理的格式解码后,可以变成一个字符串,整数或对象,此时才具有数据类型。 这一点必须要记住。所以任何东西只要能转化成字节数组(byte[])的,都可以存到redis里。管你是字符串、数字、对象、图片、声音、视频、还是文件,只要变成byte数组。 因此redis里的String指的并不是字符串,它其实表示的是一种最简单的数据结构,即一个key只能对应一个value。这里的key和value都是byte数组,只不过key一般是由一个字符串转换成的byte数组,value则根据实际需要而定。 在特定情况下,对value也会有一些要求,比如要进行自增或自减操作,那value对应的byte数组必须要能被解码成一个数字才行,否则会报错。 那么List这种数据结构,其实表示一个key可以对应多个value,且value之间是有先后顺序的,value值可以重复。 Set这种数据结构,表示一个key可以对应多个value,且value之间是没有先后顺序的,value值也不可以重复。 Hash这种数据结构,表示一个key可以对应多个key-value对,此时这些key

HashMap?

…衆ロ難τιáo~ 提交于 2020-02-27 19:08:42
HashMap数据结构是什么? JDK1.7 HashMap由数组+链表组成的,JDK1.8 HashMap由数组+链表+红黑树组成的 数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。 =============================================================================== key-value是通过什么方式存储进去的? key使用set集合来存储的,value使用collection来存储的。 =============================================================================== 解释hashcode、取余、去重等操作? 计算hashcode的值: //这是一个神奇的函数,用了很多的异或,移位等运算

字符流中第一个不重复的字符

南笙酒味 提交于 2020-02-27 03:30:10
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 public class Solution { //Insert one char from stringstream String s = ""; char hash[]=new char[256]; public void Insert(char ch) { s+=ch; hash[ch]++; } //return the first appearence once char in current stringstream public char FirstAppearingOnce() { for(int i = 0;i<s.length();i++){ if(hash[s.charAt(i)] == 1) return s.charAt(i); } return '#'; } } 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/3162234

都说知道 HashMap 线程不安全,那它为啥就不安全?

倖福魔咒の 提交于 2020-02-26 01:17:08
我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。 1.jdk1.7中的HashMap 在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况: public static void main(String[] args) { HashMapThread thread0 = new HashMapThread(); HashMapThread thread1 = new HashMapThread(); HashMapThread thread2 = new HashMapThread(); HashMapThread thread3 = new HashMapThread(); HashMapThread thread4 = new HashMapThread(); thread0.start(); thread1.start(); thread2.start(); thread3.start(); thread4.start(); } } class HashMapThread extends Thread { private static AtomicInteger

java源码学习---HashMap

橙三吉。 提交于 2020-02-25 19:07:46
开门见山,直接干 HashMap是java常用的一个集合,每个元素的key经过哈希算法后储存在链表或红黑树的一种键值对数据集合(JDK1.8) 从HashMap新增元素说起 map.put( "key" , "value" ); 这是我们日常向HashMap插入元素的其中一种方式,put(k,v)的源码 public V put( K key, V value) { return putVal( hash (key), key, value, false , true ); } put()会再调用一个putVal(),但是在这之前key会通过hash()计算出对应位置的值,真正的put操作,就是从这里开始 final V putVal( int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node< K , V >[] tab; Node< K , V > p; int n, i; if ((tab = table ) == null || (n = tab. length ) == 0 ) n = (tab = resize()). length ; if ((p = tab[i = (n - 1 ) & hash]) == null ) tab[i] = newNode(hash, key,

Java开发区块链只需150行代码

筅森魡賤 提交于 2020-02-25 18:57:30
本文目的是通过java实战开发教程理解区块链是什么。将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等。这个基本的java区块链也实现简单的工作量证明系统。本文用一个java例子,演示了开发一个区块链应用的过程,涉及到所有区块链的概念和基本实现方法。本文阅读对象,主要是希望和即将从事区块链开发的项目架构师。需要指出的是,我们用150行java代码构建的区块链达不到生产级别的,它只是为了帮助你更好的理解区块链的概念。 Java源代码保存在 Github 创建区块链 区块链就是一串或者是一系列区块的集合,类似于链表的概念,每个区块都指向于后面一个区块,然后顺序的连接在一起。那么每个区块中的内容是什么呢?在区块链中的每一个区块都存放了很多很有价值的信息,主要包括三个部分:自己的数字签名,上一个区块的数字签名,还有一切需要加密的数据(这些数据在比特币中就相当于是交易的信息,它是加密货币的本质)。每个数字签名不但证明了自己是特有的一个区块,而且指向了前一个区块的来源,让所有的区块在链条中可以串起来,而数据就是一些特定的信息,你可以按照业务逻辑来保存业务数据。 这里的hash指的就是数字签名 所以每一个区块不仅包含前一个区块的hash值,同时包含自身的一个hash值,自身的hash值是通过之前的hash值和数据data通过hash计算出来的

Python与Redis交互

淺唱寂寞╮ 提交于 2020-02-25 16:01:22
缓存系统 mongodb 直接持久化,宕机数据不丢失 redis 半持久化,手动控制,NoSQL数据库 memcache 不能持久化,存储在内存中,轻量级缓存 radis 单线程应用,通过异步实现多访存 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多, 包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis的安装 1 wget http://download.redis.io/releases/redis-3.0.6.tar.gz 2 tar xzf redis-3.0.6.tar.gz 3 cd redis-3.0.6 4 make 启动Radis 1 src/redis-server 客户端操作 1 src/redis-cli 2 redis> set name cq

面对海量的数据,我们应该如何处理?

这一生的挚爱 提交于 2020-02-25 15:25:23
一、海量数据处理 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就 是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导 致无法一次性装入内存。 那解决办法呢? 针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit- map/堆/trie树。 针对空间,无非就一个办法:大而化小,分而治之(hash映射)。 相关内容后续GitHub更新 ( 顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找 ) https://github.com/xiangjiana/Android-MS (VX:mm14525201314) 二、算法/数据结构基础 1.Bloom Filter Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地 表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在 集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也 就是Bloom Filter判断元素不再集合,那肯定不在。如果判断元素存在集合中,有一 定的概率判断错误。因此,Bloom Filter不适合那些“零错误”的应用场合。 而在能容忍低错误率的应用场合下,Bloom Filter比其他常见的算法(如hash,折 半查找

chapter9.1、魔术方法

泄露秘密 提交于 2020-02-24 05:51:09
魔术方法 python精华之一 特殊属性 __name__ 类,函数,方法等的名字 __modle__ 主模块,当前的模块__main__,其他模块调用返回模块对象 __class__ 相当于type,对象或类所属的类 __bases__ 返回基类的元组,顺序为基类列表中出现的顺序 __doc__ 文档,未定义为None __mro__ 类的mro,定义时就会计算并放在类的属性里的__mro__中 __dict__ 类或实例的属性,可写的字典,这里注意有些只读字典 查看属性 __dir__ 返回类的或者对象的所有成员的列表, dir()函数调用__dir__(),dir是内建函数, 如果类中和实例中定义了__dir__:   使用实例调用时,实例中如果定义了__dir__,就会覆盖类__dir__,返回实例中的__dir__的运行结果;   如果实例中没有,就会调用父类的,如果父类没有,就继续向上找,中间有的话就会运行该方法; 如果类中和实例中没有定义__dir__:   如果对象是模块对象,返回的列表包含文件的属性名和变量名,受作用域影响,一般在模块上使用时,调用模块,在自己的模块搜集   如果对象是类或类的实例,近似于自己实例的字典加类的字典加object的字典,返回列表包含类的属性名,及它的基类的属性名   如果dir() 括号中不写,返回的列表包含不同的内容