hash函数

C++写壳之高级篇

梦想与她 提交于 2019-11-28 03:49:23
来源: https://bbs.pediy.com/thread-251267.htm 看雪论坛 作者:九阳道人 之前在写了写壳基础篇,现在就来完成写壳高级篇。没有基础篇的知识,那理解高级篇就比较困难。有了写壳基础后,才能在其基础上逐步实现高级功能,加壳的目的主要是防止别人破解,而想要别人很难破解,我认为要在花指令、混淆和指令虚拟化上大量的时间及脑力才能做到,这个比较费脑力费时间。我在此就说说一些能快速入门的反调试技术,下面说的难度将逐渐提升。 主要工具: VS2017、x64dbg、OD 实验平台:win10 64位 实现功能:反调试、IAT加密、Hash加密、动态解密。 一、反调试 顾名思义,就是阻止别人调试程序,在PEB结构中有一个BegingDebugged标志位专门用于检测是否处于调试状态,为1则处于调试状态,用VS2017测试下列程序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include "pch.h" #include <iostream> #include <windows.h> / / 反调试 1 bool PEB_BegingDebugged() { bool BegingDebugged = false; __asm { mov eax, fs:[

容器之知识点总结

大城市里の小女人 提交于 2019-11-28 02:00:40
1.List,Set与Map List(有序可重复): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(无序不重复): 不允许重复的集合。不会有多个元素引用相同的对象。 Map(无序不重复): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复。 2.ArrayList与LinkedList 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 2. 底层数据结构: Arraylist 底层使用的是 Object 数组 ; LinkedList 底层使用的是 双向链表 数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别!) 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位

hash

流过昼夜 提交于 2019-11-28 01:35:33
Hash 1. 什么是 hash 压缩映射 优点:哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。 2. 相关概念 散列表=哈希表; 散列函数=哈希函数; 3. 单向 它是一种单向函数是“非对称”的,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。 4. 哈希查找的两个步骤 [1] 使用哈希函数将被查找的键转换为数组的索引。 [2] 处理哈希碰撞冲突。 5. 常用的希哈函数 ( 博客: https://blog.csdn.net/tanggao1314/article/details/51457585 ) [1] 直接定址法:线性函数。 优点:简单。 缺点:造成空间大量的浪费。 [2] 数字分析法:分析关键字集中的全体,并从中提取分布均匀的若干位或它们的组合作为地址。 适用范围:所有关键字值已知。 [3] 折叠法:移位叠加/边界叠加。 适用范围:关键字的数字位数特别多。 [4] 平方取中法( 常用 ):这个方法是先取关键字的平方,然后根据可使用空间的大小,选取平方数是中间几位为哈希地址。 优点:扩大差别。 适用范围:关键字中的每一位都有某些数字重复出现频度很高的现象。 [5] 除留余数法:理论研究表明,除数最好为素数。 6. 哈希冲突解决办法 [1] 开放定址法(再散列法):当关键字key的哈希地址p=H(key)出现冲突时,以p为基础

HashTable源码分析

痞子三分冷 提交于 2019-11-28 01:19:59
前言:HashTable线程安全的集合类,虽然它线程安全,然而在日常开发中使用的频率很低,毕竟锁的颗粒度太大了。但是这并不妨碍我们对其内部原理进行了解。 注:jdk版本为1.8.0_172。 1.HashTable基本概念 HashTable与HashMap一样,都是以键值对的形式存储数据。但是HashTable的键值不能为null,而HashMap的键值是可以为null的。HashTable线程安全,因为它的元素操作方法上都加了synchronized关键字,这就导致锁的粒度太大,因此日常开发中一般建议使用ConcurrentHashMap。注意HashTable的映射关系不是有序的,毕竟是以hashCode散列存储。 首先来看HashTable的继承关系: 1 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable HashTable继承了Dictionary,实现了Map、Cloneable、Serializable接口。 HashTabel构造函数 HashTable共有4个构造函数。 #1.默认构造函数 1 public Hashtable() { 2 this(11, 0.75f); 3 } 分析: 从默认构造函数可知

Vue 问题集锦(概念)

房东的猫 提交于 2019-11-28 00:22:16
一 .computed 和 watch 的区别和运用的场景?    computed: 计算属性,依赖其他属性值,并且computed 的值有缓存,只有它依赖的值发生改变,下一次获取它的值才会重新计算。   watch: 更多的是 观察 的作用,类似数据的监听回调,每次监听的数据发生变化都会执行回调然后进行操作。 二. Vue 的父组件和子组件生命周期钩子函数执行顺序? 加载渲染过程 父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted 子组件更新过程 父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated 父组件更新过程 父 beforeUpdate -> 父 updated 销毁过程 父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed 三. 组件中 data 为什么是一个函数?    组件是用来复用的,js对象是引用类型,如果是组件的data是对象,那么作用域就没有隔离,自组件的data会相互影响,如果是函数,每个实例可以维护一份一份被返回的对象的独立拷贝

HashMap实现原理及源码分析

假装没事ソ 提交于 2019-11-27 22:54:39
  哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。 目录     一、 什么是哈希表   二、 HashMap实现原理   三、 为何HashMap的数组长度一定是2的次幂?   四、 重写equals方法需同时重写hashCode方法   五、 总结 一、什么是哈希表   在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能    数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)    线性链表 :对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)    二叉树

Hash

余生长醉 提交于 2019-11-27 22:19:37
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(来源百度百科解释) Hash的特点 算法是公开的 对相同数据运算,得到的结果是一样的 对不用数据运算,如MD5得到的结果都是32个字符长度的字符串 这玩意没法逆运算 来源: https://www.cnblogs.com/deepalley/p/11380274.html

ThreadLocal 是怎么实现的?

让人想犯罪 __ 提交于 2019-11-27 22:04:25
ThreadLocal 是怎么实现的? ThreadLocal 大家都很熟悉了,那么他是如何工作的呢? 下面按照我们平时的使用顺序,来扒一扒他的实现机制(注意源码只提供了必要内容) 代码版本 jdk8 ThreadLocal() set() 划重点 大家要认真看帖 get() remove() ThreadLocal /** * Creates a thread local variable. * @see #withInitial(java.util.function.Supplier) */ public ThreadLocal() { } 诶? 什么都没有! 惊喜不惊喜? 意外不意外? set()方法 核心方法ThreadLocal的主要逻辑都在这里了 public void set(T value) { // 拿到当前线程 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) // 直觉告诉我这里不简单 map.set(this, value); else // 直觉告诉我这里不简单 createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; }

HashMap面试总结

不羁岁月 提交于 2019-11-27 21:37:57
作者:孤独烟 出处: http://rjzheng.cnblogs.com/ 修改部分内容 (1) HashMap的实现原理 此题可以分为下面几个小问题来问 • 看过HashMap源码吗,知道原理吗? • 为什么用数组+链表? • hash冲突你还知道哪些解决办法? • 用LinkedList代替数组结构可以么? 看过HashMap源码吗,知道原理吗? HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体。 只是在JDK1.8中,链表长度大于8的时候,链表会转成红黑树。 为什么用数组+链表? 数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到. 链表是用来解决hash冲突问题,当出现hash值一样的情形,就在数组上的对应位置形成一条链表。 ps: 这里的hash值并不是指hashcode,而是将hashcode高低十六位异或过的。至于为什么要这么做,继续往下看。 hash冲突你还知道哪些解决办法? 比较出名的有四种 (1)开放定址法 (2)链地址法 (3)再哈希法 (4)公共溢出区域法 HashMap中使用的是链地址法。 用LinkedList代替数组结构可以么? 当然是可以的,稍微说明一下,此题的意思是,源码中是这样的

RSA加密解密及RSA签名和验证

陌路散爱 提交于 2019-11-27 19:52:03
1.RSA加密解密:  (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密 2.RSA签名和验证  (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)获取待签名的Hash码 (3)获取签名的字符串 (4)验证 3.公钥与私钥的理解:  (1)私钥用来进行解密和签名,是给自己用的。  (2)公钥由本人公开,用于加密和验证签名,是给别人用的。 (3)当该用户发送文件时,用私钥签名,别人用他给的公钥验证签名,可以保证该信息是由他发送的。当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他接收到。 class RSACryption { #region RSA 加密解密 #region RSA 的密钥产生 /// <summary> /// RSA产生密钥 /// </summary> /// <param name="xmlKeys">私钥</param> /// <param name="xmlPublicKey">公钥</param> public void RSAKey(out string xmlKeys, out string xmlPublicKey) { try { System.Security.Cryptography.RSACryptoServiceProvider rsa