hash函数

C++-POJ1200-Crazy Search[hash]

眉间皱痕 提交于 2020-02-11 20:43:13
由于已经给出字符只有NC种,故可以 把子串视为一个NC进制的数 ,以此构造hash函数就可以了 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 using namespace std; 12 const int MAXN=16000001; 13 char s[MAXN];int hash[MAXN],num[130]; 14 int main(){ 15 for(int N,NC;scanf("%d%d",&N,&NC)!=EOF;){ 16 memset(hash,0,sizeof(hash)); 17 memset(num,0,sizeof(num)); 18 scanf("%s",s+1); 19 int cnt=0,ans=0,len=strlen(s+1); 20 for(int i=1;i<=len&&cnt<=NC;i++)if(!num[s[i]])num[s[i]]=cnt++; 21 for(int i=1

Hash算法(含python实现)

一个人想着一个人 提交于 2020-02-10 07:26:18
1. 简介 哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。 这种散列变换是一种单向运算,具有 不可逆性 即不能根据散列值还原出输入信息,因此严格意义上讲 Hash算法是一种消息摘要算法 ,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。 2. 应用 Hash主要应用在数据结构以及密码学领域。 在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的 快速性 ,并且要保证hash 均匀分布 ;而应用在密码学中就要优先考虑 抗碰撞性 ,避免出现两段不同明文hash值相同的情况发生。 2.1 在密码学领域的应用 在密码学中,Hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。比如一些登陆网站并不会直接明文存储用户密码,存储的是经过hash处理的密码的摘要(hash值),当用户登录时只需要对比输入明文的摘要与数据库存储的摘要是否相同;即使黑客入侵或者维护人员访问数据库也无法获取用户的密码明文,大大提高了安全性。 2.2 在数据结构中的应用 使用Hash算法的数据结构叫做哈希表,也叫散列表,主要是为了提高查询的效率。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫做哈希表

Hash哈希(一)

眉间皱痕 提交于 2020-02-10 07:26:01
Hash哈希(一)    哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知识。本文参考了很多博文,感谢大家的无私分享。 基本概念    Hash,一般翻译做“散列”,也有直接音译为“哈希”的。那么哈希函数的是什么样的?大概就是 value = hash(key),我们希望key和value之间是唯一的映射关系。   大家使用的最多的就是哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数或散列函数。    实际中的Hash主要有两种应用:加密和压缩。 在加密方面,Hash哈希是把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值,最广泛应用的Hash算法有MD4、MD5、SHA1。 在压缩方面,Hash 哈希 是指把一个大范围映射到一个小范围,往往是为了节省空间,使得数据容易保存。 Hash的特点    主要原理就是把大范围映射到小范围,因此输入范围必须和小范围相当或者比它更小,否则增加冲突。   Hash函数逼近单向函数,所以可以用来对数据进行加密。(单项函数:如果某个函数在给定输入的时候

数据结构中的hash

自作多情 提交于 2020-02-10 07:25:50
最近接触数据结构的时候突然发现一直在使用哈希表,哈希算法。那么到底什么是哈希(hash)。查找资料发现一个比较有意思的解释,在此分享一下。 人家说的很好我就直接粘过来。 ============================================================================================================================ 但凡是从事过计算机行业的人,多多少少都会听说过这个概念,但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统称为哈希(这么叫好听,哈希=散列),通过百度以及谷歌都没有直接找到Hash的定义,而是找到了一些相关的概念,哈希算法,哈希函数,哈希表等概念。 我所理解的哈希是指一个过程,这个过程就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值。这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。 哈希函数、算法 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改一个字母的段落,随后的哈希都将产生不同的值

K:hash的应用场景

我是研究僧i 提交于 2020-02-10 07:25:21
本博文主要用于讲解Hash的应用场景 Hash主要应用于数据结构中和密码学中。 用于数据结构时,主要是为了提高查询的效率,这就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以。 在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。 1. 数据结构 使用Hash的数据结构叫做散列表,主要是为了提高查询的效率。也有直接译作哈希表,也叫Hash表, Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。 2.密码学 在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。 举个用于消息摘要例子,银行的数据库中是不能保存用户密码的原文的,只能保存密码的hash值。在这种应用场景里,对于抗碰撞和抗篡改能力要求极高,对速度的要求在其次。一个设计良好的hash算法,其抗碰撞能力是很高的。 需要注意的是,hash算法在密码学中,主要用于信息的摘要和完整性校验,而不是加密。 概括来说,哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串

哈希表

為{幸葍}努か 提交于 2020-02-09 11:37:33
C语言哈希表 【1】设计数据结构 (1)哈希表由一个结构体HashTable构成 (2)结构体HashTable由两个元素组成。其一为指针数组(链式存储元素);其二为整型变量(记录元素个数) (3)指针数组类型为HashNode *(哈希节点指针) (4)结构体HashNode由数据域和指针域组成。数据域也是一种结构类型变量,指针域为一个同类型指针,为了实现链式存储。 (5)数据域结构体ElemType由关键码以及其他相关信息组成(在此程序里没有添加) (6)拟定哈希表长度为13 【2】C语言表示数据结构 1 #define M 13 2 typedef int KeyType; 3 typedef struct 4 { 5 KeyType key; 6 //otherinfo; 7 }ElemType; 8 typedef struct _Node 9 { 10 ElemType data; 11 _Node *next; 12 }HashNode; 13 typedef struct 14 { 15 HashNode *table[M]; 16 int len; 17 }HashTable; 【3】函数设计 在设计函数之前,让我们先理解一下基本的逻辑: 哈希表中存储的每个元素都有一个关键码,而每个关键码都可以通过与哈希表的总数取模(当然这个算法可以任意选择)得到一个索引

Nodejs实战系列:数据加密与crypto模块

好久不见. 提交于 2020-02-08 14:11:56
博客地址: 《NodeJS模块研究 - crypto》 Github : https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各种各样加密算法的 API。这篇文章记录了常用加密算法的种类、特点、用途和代码实现。其中涉及算法较多,应用面较广,每类算法都有自己适用的场景。为了使行文流畅,列出了本文记录的几类常用算法: 内容摘要:散列(Hash)算法 内容摘要:HMac 算法 内容加解密:对称加密(AES)与非对称加密解密(RSA) 内容签名:签名和验证算法 散列(Hash)算法 散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。基本原理是将任意长度数据输入,最后输出固定长度的结果。 hash 算法具有以下特点: 不能从 hash 值倒推原数据 不同的输入,会有不同的输出 好的 hash 算法冲突概率更低 正因为 hash 算法的这些特点,因此 hash 算法主要用于:加密、数据检验、版本标识、负载均衡、分布式(一致性 hash)。 下面实现了一个获取文件标识的函数: const crypto = require("crypto"); const fs = require("fs"); function getFileHash(file, algorithm

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

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

10-Python之内置函数

十年热恋 提交于 2020-02-07 14:51:27
内置函数   我们一起来看看python里的内置函数。什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等。截止到python版本3.6.2,现在python一共为我们提供了 68个内置函数 。它们就是python提供给你直接可以拿来使用的所有函数。这些函数有些我们已经用过了,有些我们还没用到过,还有一些是被封印了,必须等我们学了新知识才能解开封印的。那今天我们就一起来认识一下python的内置函数。这么多函数,我们该从何学起呢? 内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() ord() sum() bytearray() filter() issubclass() pow() super() bytes() float() iter() print() tuple() callable() format() len() property() type()

由一个算法引发的hash讲解

吃可爱长大的小学妹 提交于 2020-02-06 17:32:57
这个春节真长,闲来无事看看算法视频,不得不说老师讲得透彻深刻、通俗易懂,趁热打铁,做个总结 请听题 :给N(1<N<10)个自然数,每个数的范围为1~10000,现在让你以最快的速度判断某一个数是否在这N个数内,不能用现有的HashMap,该如何实现? 最直接反应的解决方法 法一:遍历 法二:排序+二分 ...... 不符合本文标题,也不够高级... 更高级的做法 :开辟一个数组,最大下标为N个数中最大的数,将N个数作为数组的下标,数组所有值默认0,若该数存在,则将该数下标对应得值改成1,判断一个K在不在N个树中,直接判断a[k]是否为1即可 举个栗子: 给定一组数 2,0,17,31,5,判断10是否在其中。 1、建立数组a[30] 2、将a[0]~a[29]的值都默认成0 3、将a[2]、a[0]、a[17]、a[31]、a[5]改成1 4、判断a[10]是否等于1,若是则在其中,否则不在 这就是最基础的hash算法 但是。。。。 有个问题:当最大数据过大时,非常浪费空间。如果题目再加个条件,只给10个空间,怎么办??? 取模:10个数,最多就是10个空间。其实就是Hash函数( 就是Hash函数,不太懂, ) 继续以上述栗子为例 2%10=2 => a[2] = 2 0%10=0 => a[0] = 0 17%10=7 => a[7] = 17 31%10=1 => a[1]