hash

hashlib模块

别等时光非礼了梦想. 提交于 2020-04-01 06:03:21
目录 hashlib模块 1 哈希hash的定义 2 hash值的特点 3 hash的用途 4 hashlib模块的使用 4.1 密码密文传输与验证 4.2 文件完整性校验 hashlib模块 1 哈希hash的定义 hash一类算法,该算法接受传入的内容,经过运算得到一串hash值 2 hash值的特点 ①只要传入的内容一样,得到的hash值必然一样 ②不能由hash值返解成内容 ③不管传入的内容有多大,只要使用的hash算法不变,得到的hash值长度是一定 3 hash的用途 用途1:特点②用于密码密文传输与验证 用途2:特点①,③用于文件完整性校验 4 hashlib模块的使用 4.1 密码密文传输与验证 import hashlib m=hashlib.md5() # 创建一个工厂 m.update('hello'.encode('utf-8')) # 输入原料 m.update('world'.encode('utf-8')) # 输入原料 res=m.hexdigest() # 'helloworld' # 得到结果 print(res) # fc5e038d38a57032085441e7fe7010b0 m1=hashlib.md5('he'.encode('utf-8')) m1.update('llo'.encode('utf-8')) m1.update('w

常用模块之算法模块

≡放荡痞女 提交于 2020-04-01 05:47:31
一、何为算法模块:算法模块即hash模块,hash是一类算法,是把接收的内容经过某种运算得到一串hash值的过程。 二、hash值得特点   1、无法通过hash值反解出原内容。   2、同样的内容通过相同的hash算法得出的hash值必定一样。   3、无论传入的内容大小是多少,通过相同hash算法得出的hash值的长度都相同。 三、hash算法的用途   1、根据其无法反解的特点可以对密码加密后传输并验证。   2、根据其对应及等长的特点可以用于校验文件的完整性。 四、具体使用 import hashlib dongles = hashlib.md5('aaa'.encode('utf-8')) # 获得 hash操作堆并声明md5算法,并传入第一部分的内容 'aaa' dongles.update('bbb'.encode('utf-8')) # 传入第二部分的内容 dongles.update('ccc'.encode('utf-8')) # 传入第三部分的内容 print(dongles.hexdigest()) # 将堆中内容一起转为 hash值,结果为 d1aaf4767a3c10a473407a4e47b02da6 来源: https://www.cnblogs.com/caoyu080202201/p/12610093.html

23---常用模块2

我是研究僧i 提交于 2020-03-31 20:39:50
一 json&pickle模块 1 什么是序列化和反序列化 序列化指的是把内存的数据类型转换成一种特定的格式的内容,该格式的内容可用于存储或者传输给其他平台使用 序列化: 内存中的数据类型----》序列化----》特定的格式(json/pickle格式) 反序列化: 内存中的数据类型《----反序列化《----特定的格式(json/pickle格式) 2 为什么要用 序列化得到结果==》特定格式的内容有两种用途 1 可用于存储====》用于存档(自己的程序使用) 2 传输给其他平台使用====》跨平台数据交互(两种语言共有的数据类型)(给其他语言的程序使用) python列表----特定格式----java数组 强调: 针对用途1的特定一种格式:可以是一种专用的格式===》pickle只有python可以识别 针对用途2的特定一种格式:应该是一种通用能够被所有语言识别的格式====》json 3 如何用序列化和反序列化 1 json模块 # 序列化 import json res = json.dumps([1,2,3,4,True,False]) print('序列化结果',res) # 'true'---字符串类型 # 序列化结果可以存在文件中:复杂方法 with open('json.txt', 'w', encoding='utf-8') as f: f.write(res

查询set、dict、dict.keys()的速度对比

混江龙づ霸主 提交于 2020-03-31 03:20:37
查找效率:set>dict>list 单次查询中: list set dict O(n) set做了去重, 本质应该一颗红黑树 (猜测,STL就是红黑树), 复杂度 O(logn); dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找, 其查找复杂其实是O(logn),并不是所谓的O(1)。 O(1)只是理想的实现, 实际上很多hash的实现是进行了离散化的。 dict比set多了一步hash的 过程,so 它比set慢,不过差别不大。 那么为什么dict.keys()查询速度比另外dict,set慢很多呢?这就要对比list、dict、set三种的数据结构了。 [1]dict.keys()实际上是list(keys),是dict的所有key组成的list。查找一个元素是否在list中是以list的下标为索引遍历list. [2]而查询是否在dict中,是将key以hash值的形式直接找到key对应的索引,根据索引可直接访问value。对量大的dict查询,自然是后者快很多。 [3]而set和dict的存储原理基本是一样的,唯一不同的是,set没有value,只有key。对查询key是否在dict或sset内,效果基本上是一样的。 由此,可以得出,如果存储的数据会被反复查询,且量大,那么, 尽量不要用list,尽量用dict,如果元素不重复,用set更好。

212

▼魔方 西西 提交于 2020-03-30 12:33:24
数据结构 在 JDK1.8 中,HashMap 是由 数组+链表+红黑树 构成 当一个值中要存储到HashMap中的时候会根据Key的值来计算出他的hash,通过hash值来确认存放到数组中的位置,如果发生hash冲突就以链表的形式存储,当链表过长的话,HashMap会把这个链表转换成红黑树来存储 在看源码之前我们需要先看看一些基本属性 //默认初始容量为16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //默认负载因子为0.75 static final float DEFAULT_LOAD_FACTOR = 0.75f; //Hash数组(在resize()中初始化) transient Node<K,V>[] table; //元素个数 transient int size; //容量阈值(元素个数超过该值会自动扩容) int threshold; table数组里面存放的是Node对象,Node是HashMap的一个内部类,用来表示 来源: https://www.cnblogs.com/miaowwwww/p/12597353.html

ysoserial分析【二】7u21和URLDNS

落花浮王杯 提交于 2020-03-30 02:49:19
目录 7u21 gadget链分析 hashCode绕过 参考 URLDNS 7u21 7u21中利用了TemplatesImpl来执行命令,结合动态代理、AnnotationInvocationHandler、HashSet都成了gadget链。 先看一下调用栈,把ysoserial中的调用栈简化了一下 LinkedHashSet.readObject() LinkedHashSet.add() Proxy(Templates).equals() AnnotationInvocationHandler.invoke() AnnotationInvocationHandler.equalsImpl() Method.invoke() ... TemplatesImpl.getOutputProperties() TemplatesImpl.newTransformer() TemplatesImpl.getTransletInstance() TemplatesImpl.defineTransletClasses() 对_bytecodes属性的值(实例的字节码)进行实例化 RCE 其中关于 TemplatsImpl 类如何执行恶意代码的知识可以参考另一篇文章中对CommonsCollections2的分析,这里不再赘述。只要知道这里调用 TemplatesImpl

7.7 HashSet和HashMap的性能选项

馋奶兔 提交于 2020-03-28 11:28:36
  对于HashSet及其子类而言,它们采用hash算法来决定集合中元素的存储位置,并通过hash算法来控制集合的大小;对于HashMap、Hashtable及其子类而言,它们采用hash算法来决定Map中的key的存储,并通过hash算法来控制集合的大小。   hash表里可以存储元素的位置被称为"桶(bucket)",在通常情况下,单个"桶"里存储一个元素,此时具有最好的性能:hash算法可以根据hashCode值计算出"桶"的存储位置,接着从"桶"里取出元素。但hash表的状态是open的:在发生"hash冲突"的情况下,单个桶可以存储多个元素,这些元素以链表形式存储,必须按顺序搜索。 下图是hash表保存个元素,且发生"hash冲突"的示意图: 因为HashSet和HashMap、Hashtable都使用hash算法来决定其元素(HashMap只考虑key)的存储,因此HashSet、HashMap的hash表包含以下属性: ★容量(Capacity):hash表中桶的数量 ★初始化容量(initial capacity):创建hash表时桶的数量。HashMap和HashSet都允许在构造器中指定初始容量。 ★尺寸(size):当前hash表记录的数量 ★负载因子(load factor):负载因子等同于"size/capacity"。负载因子为0表示空的hash表,0

Java 一些面试题(未完待续)

依然范特西╮ 提交于 2020-03-27 16:57:29
计算机网络 面试基础知识之计算机网络 基础知识 集合框架 多线程 Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? leep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间, 将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态)。 wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lockpool),如果线程重新获得对象的锁就可以进入就绪状态 线程的sleep()方法和yield()方法有什么区别? ① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会; ② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态; ③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常; ④ sleep()方法比yield()方法

ConcurrentHashMap --- 第一 cas 操作数组元素

这一生的挚爱 提交于 2020-03-27 15:51:31
首先贴 java 8 中实现的源代码 1 /** Implementation for put and putIfAbsent */ 2 final V putVal(K key, V value, boolean onlyIfAbsent) { 3 if (key == null || value == null) throw new NullPointerException(); 4 int hash = spread(key.hashCode()); 5 int binCount = 0; 6 for (Node<K,V>[] tab = table;;) { 7 Node<K,V> f; int n, i, fh; 8 if (tab == null || (n = tab.length) == 0) // 第一次使用时,整个 table 为 null 9 tab = initTable(); 10 else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { 11 if (casTabAt(tab, i, null, 12 new Node<K,V>(hash, key, value, null))) 13 break; // no lock when adding to empty bin 14 } 15 else

ConcurrentHashMap(1.8) 相关整理

天涯浪子 提交于 2020-03-26 15:03:22
1. ConcurrentHashMap 1.1 HaspMap(JDK 1.8) JDK 1.8 HashMap JDK 1.8 对 HashMap 进行了修改, 最大的不同就是利用了红黑树,其由数组+链表+红黑树组成 。 JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标,但之后需要顺着链表依次比较才能查找到需要的元素,时间复杂度取决于链表的长度,为 O(N) 。 为了降低这部分的开销,在 JDK 1.8 中,当链表中的元素超过 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN) 。 JDK 1.8 使用 Node(1.7 为 Entry) 作为链表的数据结点,仍然包含 key,value,hash 和 next 四个属性。 红黑树的情况使用的是 TreeNode。 根据数组元素中,第一个结点数据类型是 Node 还是 TreeNode 可以判断该位置下是链表还是红黑树。 核心成员变量于 1.7 类似,增加了核心变量,如下表。 属性 说明 TREEIFY_THRESHOLD 用于判断是否需要将链表转换为红黑树的阈值,默认为 8。 put 方法过程 public V put(K key, V value) { return putVal(hash(key), key, value, false, true);