哈希表

----------------------集合-------------------------

做~自己de王妃 提交于 2019-12-23 11:44:30
1:集合:存储对象 遍历取出对象 List<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>(); 必须要引用数据类型,不能是基本类型,除非把基本数据类型变成包装类 b:集合 * b1:集合的层次结构 * Iterable <E> 实现了Iterable接口的集合类才可以被foreach * Collection 接口 集合最顶层的接口 * List 接口特点: 有序 有索引 可以重复元素 元素存与取的顺序相同 泛型用来约束集合中可有存储的数据类型 * ArrayList 底层是数组 根据索引查询,增删慢 ArrayList是实现了基于动态数组的数据结构 寻址容易,插入和删除困难; * LinkedList 底层是链表 增删快 查询慢 LinkedList是基于链表的数据结构 寻址困难,插入和删除容易。 子类特有的功能,不能多态调用 * Stack 栈结构的集合 stack继承vector其底层用的还是数组存储方式 Stack 栈结构的集合 官方建议:使用栈尽量使用ArrayDeque: Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。例如: Deque stack = new ArrayDeque(); * Vector 线程安全的线性集合 *

Java中常见数据结构:list与map

北慕城南 提交于 2019-12-23 07:56:55
1 1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数组,查询快,增删慢 9 线程安全,效率低 10 LinkedList 11 底层数据结构是链表,查询慢,增删快 12 线程不安全,效率高 13 Set(无序,唯一) 14 HashSet 15 底层数据结构是哈希表。 16 哈希表依赖两个方法:hashCode()和equals() 17 执行顺序: 18 首先判断hashCode()值是否相同 19 是:继续执行equals(),看其返回值 20 是true:说明元素重复,不添加 21 是false:就直接添加到集合 22 否:就直接添加到集合 23 最终: 24 自动生成hashCode()和equals()即可 25 26 LinkedHashSet 27 底层数据结构由链表和哈希表组成。 28 由链表保证元素有序。 29 由哈希表保证元素唯一。 30 TreeSet 31 底层数据结构是红黑树。(是一种自平衡的二叉树) 32 如何保证元素唯一性呢? 33 根据比较的返回值是否是0来决定 34 如何保证元素的排序呢? 35 两种方式 36 自然排序(元素具备比较性) 37 让元素所属的类实现Comparable接口 38

redis hash类型的常用命令

故事扮演 提交于 2019-12-23 05:55:28
简介 edis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿) 可以看成具有KEY和VALUE的MAP容器,该类型非常适合于存储值对象的信息, 如:uname,upass,age等。该类型的数据仅占用很少的磁盘空间(相比于JSON) 命令 赋值语法: HSET KEY FIELD VALUE //为指定的KEY,设定FILD/VALUE HMSET KEY FIELD VALUE [FIELD1,VALUE1]…… 同时将多个 field-value (域-值)对设置到哈希表 key 中。 取值语法: HGET KEY FIELD //获取存储在HASH中的值,根据FIELD得到VALUE HMGET key field[field1] //获取key所有给定字段的值 HGETALL key //返回HASH表中所有的字段和值 HKEYS key //获取所有哈希表中的字段 HLEN key //获取哈希表中字段的数量 删除语法: HDEL KEY field1[field2] //删除一个或多个HASH表字段 其它语法: HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值 HINCRBY key field

如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083

时间秒杀一切 提交于 2019-12-23 04:27:12
本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式。还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路。相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施。 作为一名Web开发人员,我们经常需要与用户的帐号系统打交道,而这其中最大的挑战就是如何保护用户的密码。经常会看到用户账户数据库频繁被黑,所以我们必须采取一些措施来保护用户密码,以免导致不必要的数据泄露。 保护密码的最好办法是使用加盐密码哈希( salted password hashing)。 重要警告: 请放弃编写自己的密码哈希加密代码的念头 !因为这件事太容易搞砸了。就算你在大学学过密码学的知识,也应该遵循这个警告。所有人都要谨记这点:不要自己写哈希加密算法! 存储密码的相关问题已经有了成熟的解决方案,就是使用 phpass ,或者在 defuse/password-hashing 或 libsodium 上的 PHP 、 C# 、 Java 和 Ruby 的实现。在对密码进行哈希加密的问题上,人们有很多争论和误解,可能是由于网络上有大量错误信息的原因吧。对密码哈希加密是一件很简单的事,但很多人都犯了错。本文将会重点分享如何进行正确加密用户密码。 密码哈希是什么? hash("hello") =

哈希表c++实现

拟墨画扇 提交于 2019-12-22 12:02:51
哈希函数计算地址 有冲突用探测函数获得新地址解决 为什么哈希函数查找速度快,因为他是索引查找,最好o(1),别扯那个多没用的哈希函数计算地址这些东西。 # include <iostream> using namespace std ; const int maxnum = 15 ; int HT [ maxnum ] ; //哈希地址表 int HC [ maxnum ] ; //计算单个地址的比较次数 int m = maxnum ; //线性探测总的步长 = 哈希地址表长,因为要遍历一个周期查看是否有空余位置 //哈希函数 int H ( int key ) { return key % 13 ; } void init ( ) { for ( int i = 0 ; i < maxnum ; i ++ ) { HT [ i ] = - 1 ; } for ( int i = 0 ; i < maxnum ; i ++ ) { HC [ i ] = 0 ; } } //冲突探测 //(线性探测) int LineDetect ( int H0 , int key , int & cnt ) //根据原散列地址H0来计算新的Hi不冲突地址,用cnt计算总比较次数 { int Hi ; for ( int i = 1 ; i < m ; i ++ ) //自身不需要再比较了 {

redis常见类型

。_饼干妹妹 提交于 2019-12-22 05:35:43
1.(key) Redis 键命令用于管理 redis 的键。 语法 Redis 键命令的基本语法如下: 1 redis 127.0 . 0.1 : 6379 > COMMAND KEY_NAME 实例 redis 127.0.0.1:6379> SET runoobkey redis OK redis 127.0.0.1:6379> DEL runoobkey (integer) 1 在以上实例中 DEL 是一个命令, runoobkey 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0 Redis keys 命令 下表给出了与 Redis 键相关的基本命令: 序号 命令及描述 1 DEL key 该命令用于在 key 存在时删除 key。 2 DUMP key 序列化给定 key ,并返回被序列化的值。 3 EXISTS key 检查给定 key 是否存在。 4 EXPIRE key seconds 为给定 key 设置过期时间。 5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 6 PEXPIRE key milliseconds 设置

Redis 一些操作命令

时光怂恿深爱的人放手 提交于 2019-12-22 05:35:30
string 1 SET key value 设置指定 key 的值 2 GET key 获取指定 key 的值。 3 GETRANGE key start end 返回 key 中字符串值的子字符 4 GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 5 GETBIT key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 6 MGET key1 [key2..] 获取所有(一个或多个)给定 key 的值。 7 SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 8 SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 9 SETNX key value 只有在 key 不存在时设置 key 的值。 10 SETRANGE key offset value 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 11 STRLEN key 返回 key 所储存的字符串值的长度。 12 MSET key value [key value …] 同时设置一个或多个 key-value 对。 13

Oracle Shared Pool之Library Cache

末鹿安然 提交于 2019-12-21 22:21:37
1. Shared Pool组成   Shared Pool由许多区间(Extent)组成,这些区间又由多个连续的内存块(Chunk)组成,这些内存块大小不一。从逻辑功能角度,Shared pool主要包含三个部分:Library Cache,Dictionary Cache和Control Structure。而这里,我们主要介绍其中的Library Cache。 2. Library Cache   Library Cache主要用于存储系统中的可执行对象(例如:SQL语句,PL/SQL块及相关对象等)及其相关信息(解析信息,可执行代码,相关对象及信息,相关控制结构等),以便实现这些可执行对象及其相关信息的快速访问和共享。 3. Hash Bucket Hash Bucket主要用于特定可执行对象的快速定位和存取,每个哈希桶中对应一个将多个可执行对象连接起来的链表,而这些可执行对象在链表中的表现形式就是可执行对象的句柄(Handle),当需要定位或访问特定对象时,系统通过对特定SQL或PL/SQL对象做特定哈希计算,就可以快速得知该特定对象应该位于的哈希桶,而每个哈希桶的链表比较短,尤其是高版本的Oracle中,哈希桶的链表更短,这样,在哈希桶链表中定位和访问特定对象会非常快速。至于Library Cache中哈希桶的数目,系统会根据Shared Pool的大小自动算出

Python操作redis系列以 哈希(Hash)命令详解(四)

不打扰是莪最后的温柔 提交于 2019-12-21 14:26:53
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host="123.56.74.190",port=6379,password="66666666666") 1. Hset 命令用于为哈希表中的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,旧值将被覆盖。如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回 0 。 print r.hset(name="name",key="key1",value="value") #返回的结果是 1 print r.hget(name="name",key="key1") #返回的结果是 value print r.hset(name="name",key="key1",value="hello world") #返回的结果是 0,原因是哈希表中域字段已经存在且旧值已被新值覆盖 print r.hget(name="name",key="key1") #返回的结果是 hello world 2.Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。 print r.hset(name="1", key=

解决哈希冲突的三种方法(拉链法、开放地址法、再散列法)

孤街醉人 提交于 2019-12-21 11:48:48
上篇博客我们说到了,什么是哈希冲突,其实就是再采用哈希函数对输入域进行映射到哈希表的时候,因为哈希表的位桶的数目远小于输入域的关键字的个数,所以,对于输入域的关键字来说,很可能会产生这样一种情况,也就是,一个关键字会映射到同一个位桶中的情况,这种情况就就叫做哈希冲突,解决哈希冲突的有三种方案,一种叫做拉链法(也叫作链接法、链地址法,一个意思),另外三种分别为开发地址法和再散列法。 一、拉链法 上篇博文我们举的例子,HashMap,HashSet其实都是采用的拉链法来解决哈希冲突的,就是在每个位桶实现的时候,我们采用链表(jdk1.8之后采用链表+红黑树)的数据结构来去存取发生哈希冲突的输入域的关键字(也就是被哈希函数映射到同一个位桶上的关键字)。首先来看使用拉链法解决哈希冲突的几个操作: ①插入操作:在发生哈希冲突的时候,我们输入域的关键字去映射到位桶(实际上是实现位桶的这个数据结构,链表或者红黑树)中去的时候,我们先检查带插入元素x是否出现在表中,很明显,这个查找所用的次数不会超过装载因子(n/m:n为输入域的关键字个数,m为位桶的数目),它是个常数,所以插入操作的最坏时间复杂度为O(1)的。 ②查询操作:和①一样,在发生哈希冲突的时候,我们去检索的时间复杂度不会超过装载因子,也就是检索数据的时间复杂度也是O(1)的 ③删除操作