哈希

hash

别等时光非礼了梦想. 提交于 2020-03-04 00:01:56
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的关系。Hash算法还具有一个特点,就是很难找到逆向规律。 Hash算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。 [1] Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。 常用HASH函数 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。常用Hash函数有: 1.直接寻址法。取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法

sql索引

左心房为你撑大大i 提交于 2020-03-03 05:47:26
1、创建索引 create index index_name on table_name 删除索引 delete index index_name on table_name 2、B-tree索引和Hash索引 hash索引只在memory支持。当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO。 但是它存在很多缺点: ~只能用于等式比较,不能查询范围。 ~优化器不能用hash索引来加速Oder by操作。 ~不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。只能使用整个关键字来搜索一行。 ~数据量特别大的时候,没有b-tree效率高。 3、建立索引的规则: ~利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。 ~不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。 ~尽量扩展索引而不要新建索引 ~最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

Perl 哈希

我的未来我决定 提交于 2020-03-02 19:05:58
哈希是 key/value 对的集合,Perl中哈希变量以百分号 (%) 标记开始。 访问哈希元素格式:${key}。 以下是一个简单的哈希实例: # ! / usr / bin / perl % data = ( 'google' , 'google.com' , 'runoob' , 'runoob.com' , 'taobao' , 'taobao.com' ) ; print "\$data{'google'} = $data{'google'}\n" ; print "\$data{'runoob'} = $data{'runoob'}\n" ; print "\$data{'taobao'} = $data{'taobao'}\n" ; 创建哈希 创建哈希可以通过以下两种方式: 一、为每个 key 设置 value $data { 'google' } = 'google.com' ; $data { 'runoob' } = 'runoob.com' ; $data { 'taobao' } = 'taobao.com' ; 二、通过列表设置 列表中第一个元素为 key,第二个为 value。 % data = ( 'google' , 'google.com' , 'runoob' , 'runoob.com' , 'taobao' , 'taobao.com' )

705.设计哈希集合

空扰寡人 提交于 2020-03-02 16:57:42
design-hashset 题目描述 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值。 contains(value) :返回哈希集合中是否存在这个值。 remove(value):将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。 示例: MyHashSet hashSet = new MyHashSet(); hashSet.add(1); hashSet.add(2); hashSet.contains(1); // 返回 true hashSet.contains(3); // 返回 false (未找到) hashSet.add(2); hashSet.contains(2); // 返回 true hashSet.remove(2); hashSet.contains(2); // 返回 false (已经被删除) 注意: 所有的值都在 [0, 1000000]的范围内。 操作的总数目在[1, 10000]范围内。 不要使用内建的哈希集合库。 代码 public class MyHashSet { private Bucket [ ] myBuckets ; int totalSize ; // HashSet的最大空间 public MyHashSet ( ) { //

数据库索引的作用

北战南征 提交于 2020-03-02 11:50:26
偶然在一个公众号上看到一篇对数据库索引的作用进行了通俗易懂的说明,为此特意借鉴过,留作备忘参考。 问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类,三楼放IT类… (2)IT类,又分软件类,硬件类… (3)软件类,又按照书名音序排序… 以便快速找到一本书。 与之类比,数据库存储了1000W条数据,要从中找到name=”shenjian”的记录,一条条查,要查到什么时候去? 于是,要有 索引 ,用于提升数据库的查找速度。 问题2. 哈希(hash)比树(tree)更快,索引结构为什么要设计成树型? 加速查找速度的数据结构,常见的有两类: (1) 哈希 ,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1); (2) 树 ,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n)); 可以看到, 不管是读请求,还是写请求 ,哈希类型的索引,都要比树型的索引更快一些,那为什么,索引结构要设计成树型呢? 索引设计成树形,和SQL的需求相关。 对于这样一个 单行查询 的SQL需求: select * from t where name=”shenjian”; 确实是哈希索引更快,因为每次都只查询一条记录。 所以

HashMap O(1) 复杂度的分析

六月ゝ 毕业季﹏ 提交于 2020-03-02 11:38:27
**C++**在使用STL时,经常混淆的几个数据结构, map,hash Map,unordered_map 事实上,三个容器,有着比较大的区别. Map 内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。 所以复杂度为 O(LogN) Hash map 基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域(桶)进行保存。 插入 得到key, 通过hash函数得到hash值 根据hash值 找到对应的桶号(区域), hash值对(桶数)求模 存放key和value 在对应桶内 取值 分四步: 判断key,根据key算出索引。 根据索引获得索引位置所对应的键值对链表。 遍历键值对链表(当每个桶内只有一个元素时,查找时只进行一次比较),根据key找到对应的Entry键值对。 拿到value。 分析: 以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突

静态分析基础技术

孤街浪徒 提交于 2020-02-29 09:25:23
1、使用反病毒软件来确认程序样本的恶意性 在分析一个可疑的恶意代码样本时,第一步就最好是拿多个反病毒软件扫描下这个文件,看是否有哪个引擎已经能够识别它。反病毒软件是不完美的,它们主要依靠一个已知恶意代码可识别片断的特征数据库,以及基于行为与模式匹配的分析(启发式检测),来识别可疑文件。 一些罕见的恶意代码通常也不会被反病毒软件所识别,因为它们并不在病毒库里。最后,启发式检测,尽管经常也能成功地识别出一些未知恶意代码,但仍然可以被一些新型独特的恶意代码所绕过。 VirusTotal( http://www.virustotal.com ),可调用多个反病毒引擎来进行扫描。 2、哈希值:恶意代码的指纹 哈希是一种用来唯一标识恶意代码的常用方法。 将哈希值作为标签使用 与其他分析师分享哈希值,以帮助他们来识别恶意代码 在线搜索这段哈希值,看看这个文件是否已经被识别 3、查找字符串 使用的工具strings 4、加壳与混淆恶意代码 查壳工具:PEID PE 文件以一个文件头开始,其中包括代码信息、应用程序类型、所需的库函数与空间要求。PE头中的信息对于恶意代码分析师而言,是非常有价值的。 5、链接库与函数 代码库可以被静态链接,也可以运行时链接,或者动态链接。了解代码库如何被链接的,对于我们理解恶意代码来说,是非常关键的,因为我们在PE文件头中可以找到的信息取决于链接了哪些代码库。 6

python初识之内置函数一

丶灬走出姿态 提交于 2020-02-29 08:26:04
  python的内置函数一共有68个,这里先学习55个 作用域相关:locals()和globals()   locals() 返回本地作用域中的所有名字   globals() 返回全局作用域中的所有名字 迭代器生成器相关:range() 、iter()、next()   range() 可迭代的   iter() 可迭代的.__iter__()就能得到一个迭代器   next() 迭代器.__next__()就能得到一个值 == next() 查看内容:dir()   dir() 查看一个对象拥有的方法 调用相关:callable()、help()   callable() 主要用来检验函数能否被调用   help() 查看函数帮助 def func(): print("hello") print(callable(func)) help(func())   ps:某个方法属于某个数据类型的变量,就可以用.调用,如果某个方法不依赖于任何数据类型,就可以直接调用,那么它就是内置函数或自定义函数 文件操作相关:open()、close()   f = open('文件名',打开方式,编码方式) 打开方式有r,w,a,r+,w+,a+六种,得到一个文件句柄   记得使用完后要关闭文件释放内存。f.close() 内存相关:id()、hash()   id()查看变量的内存地址  

如何重写object虚方法

心不动则不痛 提交于 2020-02-28 11:14:02
在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它。前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToString 、 Equals 和 GetHashCode 虚方法都来自于 Object 类,并且我们可以对它们进行重写。重写这三个虚方法可以说在项目开发中经常用到,只不过大部分开发人员并未留意这三个虚方法可以重写,而是自己写方法来实现。 下面我就来具体讲解一下它们三个应该怎么重写。在这里我需要说明的是本篇文章会大量涉及到设计规范和设计要求,代码只是作为辅助理解的形式出现,因此文章中的所有代码将会以代码段的形式出现。 零、 ToString ToString 重写是这三种方法中重写最简单的,也是最常用的。但是有一部分开发人员认为重写 ToString 方法意义不大,那么我在这里要说的是这种想法是错误的。当我们在对象上调用 ToString 时默认返回的是类的完全限定名称,比如说我们在 System.IO.File 对象上调用这个方法,就会返回字符串 System.IO.File ,这个结果往往并不是我们所需要的结果并且这个结果也没有什么意义。例如我们在一个 User 类中重写 ToString 方法,每次调用 User.ToString() 时返回 "XXX今年XX岁",如果我们不重写

Java内部类与常用类

我怕爱的太早我们不能终老 提交于 2020-02-28 03:41:03
@Java 内部类与常用类知识模板 大家好,我是Ziph! 今天分享下面内部类与常用类的知识内容。 结合思维导图学习效果更佳!点击下方链接进入 Java内部类与常用类思维导图 一、内部类 内部类的分类 成员内部类 静态内部类 局部内部类 匿名内部类 什么是内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类的私有成员,而不破坏封装 可为外部类提供必要的内部功能组件 成员内部类 在类的内部定义,与实现变量、实例方法同级别的类 外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象 Outer out = new Outer(); Inner in = out.new Inner(); 当外部类、内部类存在重名属性时,会优先访问内部类属性 成员内部类不能定义静态成员 静态内部类 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员 只能直接访问外部类的静态成员(实例成员需实例化外部类对象) Outer.Inner inner = new Outer.Inner(); Outer.Inner.show(); 局部内部类 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法 局部内部类访问外部类当前方法中的局部变量时,因无法保证变量的声明周期与自身相同,变量必须修饰为final 限制类的使用范围 匿名内部类