精华内容
下载资源
问答
  • JavaScript实现多项式哈希算法(附完整源码)
    2021-08-21 20:42:16

    PolynomialHash.js完整源代码

    const DEFAULT_BASE = 37;
    const DEFAULT_MODULUS = 101;
    export default class PolynomialHash {
       
      /**
       * @param {number} [base] - Base number that is used t
    更多相关内容
  • rabin-hash-function(rabin的随机多项式摘要算法) Rabin rabinhash 随机多项式 指纹生成算法
  • 题目描述输入两个多项式,计算它们的和。 每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。 如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个...

    题目描述

    输入两个多项式,计算它们的和。 每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。 如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个整数对表示。

    输入描述:

    
     

    输入为两行,分别表示两个多项式。表示每项的整数对按照次数大小降序给出。(次数绝对值小于1000,系数绝对值小于10000)

    输出描述:

    
     

    按照降次顺序输出表示和多项式的整数对(系数为0的整数对不用输出,整数对由空格分隔,最后一个整数对后不添加空格)

    示例1

    输入

    复制

    
      

    3 3 5 -2 1 4 0 4 2 3 -1 2 1 1 3 0

    输出

    复制

    
      

    3 5 2 3 -1 2 -1 1 7 0


    //想的太麻烦了,直接用hash的想法,将数组的index设置为指数,然后将值设置为系数
    //最终输出数组即可,由于指数有可能为负数,那么加上一个值将其转化为0-的范围内
    /*#include<iostream>
    #include<map>
    using namespace std;
    
    map<int ,int>mp1;
    map<int ,int>mp2;
    int main()
    {
        int n;
        while(cin>>n)
        {
            for(int i=0;i<n;i++)
            {
                int x,y;
                cin>>x>>y;
                mp1[y]=x;//系数相加可以
            }
            int m;
            cin>>m;
            for(int i=0;i<m;i++)
            {
                int x,y;
                cin>>x>>y;
                mp2[y]=x;//系数相加可以
            }
            map<int ,int>::iterator it1;
            map<int ,int>::iterator it2;
            for(it2=mp2.begin();it2!=mp2.end();it2++)
            {
                int zhishu=it2->first;
                int xishu=it2->second;
                if(mp1.find(zhishu)==mp1.end())
                {
                    mp1.insert(pair<int,int> (zhishu,xishu));
                }
                else
                {
                    mp1[zhishu]+=xishu;
                }
            }
            it1=mp1.end();
            it1--;
            cout<< it1->second <<' '<<it1->first;
            for(it1--;it1!=mp1.begin();it1--)
            {
               cout<<' '<<it1->second<<' '<<it1->first;
            }
            cout<<' '<<it1->second <<' '<<it1->first;
            cout<<endl;
        }
        return 0;
    }
    */
    #include<iostream>
    #include<string.h>
    using namespace std;
    const int N=3000;
    const int OFFSET=1000;
    int main()
    {
        int n;
        int a[N];
        int x,y;
        while(cin>>n)
        {
            memset(a,0,sizeof(a));
            for(int i=0;i<n;i++)
            {
                cin>>x>>y;
                a[y+OFFSET]+=x;
            }
            int m;
            cin>>m;
            for(int i=0;i<m;i++)
            {
                cin>>x>>y;
                a[y+OFFSET]+=x;
            }
            int flag=1;
            for(int i=N-1;i>=0;i--)
            {
                if(flag&&a[i]!=0)
                {
                    cout<<a[i]<<' '<<i-OFFSET;
                    flag=0;
                }
                else if(a[i]!=0&&!flag)cout<<' '<<a[i]<<' '<<i-OFFSET;
            }
            cout<<endl;
        }
    }
    

    展开全文
  • 前言 ...SHA hash独有得算法算法可以有多种,根据每个人来算出来 第二类(DES AES):明文得到密文,通过密文;然后服务端得到密文进行反推出来,一把钥匙 第三类(RSA):叫做RSA算法加密,公钥..

    前言

    数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的密钥之后才能显示出原容,本篇会介绍各种加密算法。

    加密介绍

    • 第一类(SHA算法):根据明文签名进行加密得到密文,而密文不能被反推出来,而这种在银行用得很多,例如下图

     SHA hash独有得算法,算法可以有多种,根据每个人来算出来

    • 第二类(DES AES):明文得到密文,通过密文;然后服务端得到密文进行反推出来,一把钥匙

    •  第三类(RSA):叫做RSA算法加密,公钥和私钥,例如git等等得应用;一把锁,但有两把钥匙可以上锁,一种钥匙可以上锁也可以打开这叫私钥,另一种只能上锁,不能打开 叫做公钥,所有得网络公司都用这种

     SHA算法

         是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

     同类型算法

         SHA1  SHA224  SHA256  SHA384  SHA512  MD5  HmacMD5 HmacSHA1  HmacSHA224  HmacSHA256  HmacSHA384  HmacSHA512   PBKDF2

    包括常用得md5算法,缩减版得sha1

    注意

     只要是哈希函数,就存在碰撞,所谓碰撞的意思是,有两个不同的数据,他们的哈希值相同(SHA1值相同)但是很少得,达到千万分之一

    实现方式

    • 以“abc”字符串来说明问题,因为 'a'=97 'b'=98  'c'=99 所以将其转换为位串后为:01100001 01100010 01100011;
    • 对转换后的位字符串进行补位操作

      Sha-1算法标准规定,必须对消息摘要进行补位操作,即将输入的数据进行填充,使得数据长度对512求余的结果为448 ,填充比特位的最高位补一个1,其余的位补0,如果在补位之前已经满足对512取模余数为448,也要进行补位,在其后补一位1即可。 总之,补位是至少补一位,最多补512位,我们依然以“abc”为例,其补位过程如下:
      初始的信息摘要:01100001 01100010 01100011
      第一步补位:    01100001 01100010 01100011 1
      ..... ......
      补位最后一位:  01100001 01100010 01100011 10.......0(后面补了423个0)
      而后我们将补位操作后的信息摘要转换为十六进制,如下所示:
      61626380 00000000 00000000 00000000
      00000000 00000000 00000000 00000000
      00000000 00000000 00000000 00000000
      00000000 00000000

    • 附加长度值,后面存放字符长度 一旦超过长度,则分为几块进行加密

      在信息摘要后面附加64bit的信息,用来表示原始信息摘要的长度,在这步操作之后,信息报文便是512bit的倍数。通常来说用一个64位的数据表示原始消息的长度,如果消息长度不大于2^64,那么前32bit就为0,在进行附加长度值操作后,其“abc”数据报文即变成如下形式:
      61626380 00000000 00000000 00000000
      00000000 00000000 00000000 00000000
      00000000 00000000 00000000 00000000
      00000000 00000000 00000000 00000018
      因为“abc”占3个字节,即24位 ,换算为十六进制即为0x18,

    •  初始化缓存,采用大端存储模式

      一个160位MD缓冲区用以保存中间和最终散列函数的结果。它可以表示为5个32位的寄存器(H0,H1,H2,H3,H4)。初始化为:
      H0 = 0x67452301
      H1 = 0xEFCDAB89
      H2 = 0x98BADCFE
      H3 = 0x10325476
      H4 = 0xC3D2E1F0
      大端存储模式:高位数据放在低地址,低位数据放在高地址

    •  计算消息摘要  (密文)

      S函数
        循环左移操作符Sn(x),x是一个字,也就是32bit大小的变量,n是一个整数且0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)
      常量字k(0)、k(1)、...k(79)
        Kt = 0x5A827999  (0 <= t <= 19)
        Kt = 0x6ED9EBA1 (20 <= t <= 39)
        Kt = 0x8F1BBCDC (40 <= t <= 59)
        Kt = 0xCA62C1D6 (60 <= t <= 79)
      非线性函数
        所要用到的一系列函数
          Ft(b,c,d)  ((b&c)|((~b)&d))    (0 <= t <= 19)
          Ft(b,c,d) (b^c^d)             (20 <= t <= 39)
          Ft(b,c,d) ((b&c)|(b&d)|(c&d))  (40 <= t <= 59)
          Ft(b,c,d) (b^c^d)               (60 <= t <= 79)
        根据结果无法反推
      开始计算摘要
        计算需要一个缓冲区,由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。80个字的缓冲区被标识为W0, W1,..., W79
        另外还需要一个一个字的TEMP缓冲区。
        为了产生消息摘要,在补好位的数据中前16个字的数据块M1, M2,..., Mn
        会依次进行处理,处理每个数据块Mi 包含80个步骤。
        现在开始处理M1, M2, ... , Mn。为了处理 Mi,需要进行下面的步骤
        (1). 将 Mi 分成 16 个字 W0, W1, ... , W15,  W0 是最左边的字
        (2). 对于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).
        (3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.
        (4) 对于 t = 0 到 79,执行下面的循环
        TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
        E = D; D = C; C = S30(B); B = A; A = TEMP;
        (5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
        在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识
        H0 H1 H2 H3 H4.

    进行循环位数;

     不断得变加工,计算,最后得到得摘要就为千万分之一,并且不是线性得。散列函数,不断调用得。

    RSA非对称加密算法

    什么是RSA公钥加密算法

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当他们三人都在美国麻省理工学院工作实习,RSA就是他们三人姓氏得开头字母一起拼在一起得。

    RSA是目前最有影响力和最常用得公钥加密算法,他能够抵抗到目前为止已知得绝大数密码攻击,已被iso推荐为公钥数据加密的标准。

    今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
    但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。

    算法思想

    1970年以前,密码学一直使用的是对称密钥,如果一个人需要和多人分享信息,比如银行需要存放所有人的密码,来进行信息交换,必然需要管理所有的密钥,能否有一种更简单的方法

    1970年一个英国工程师和数学家James H.Ellis 在研究一个非秘密的加密想法,基于一个简单又聪明的想法,上锁和解锁是相反的操作
    他可以把锁打开,交给对方后,由对方上好锁,再还给他,由他自己开锁
    这样他可以大量发出他的信息,而只需要保留单个钥匙
    当然他给出了工作原理,但不知如何用数学方法解决  也就是

    而到了后期,被另一个数学家和密码专家Cocks发现,他需要一个特殊的单向函数,正推容易,求逆很难 

    被另一个数学家和密码专家Cocks发现,他需要一个特殊的单向函数,正推容易,求逆很难

     继续将公因子扩大,所得的值只在17之内不断变换

     然后如果知道结果为9,然后 17为密钥得到  这个值是很难的,也就是

    而反过来 是很难的

     这里做函数的推导

     然后做函数转换

     最后带入进去得到下面的函数

     

     求素数的因子分解589=19*31,计算很难,如果是个1000位数呢?

    这里然后往深处深追,欧拉一个重要的函数phi(n),用于找到整数的可分解性

    这就要说到费马小定理 

    假设p是一个质数(一个大于1的自然数,除了1和它本身外,不能被其他自然数整除),而整数a不是p的倍数   

            a^p-a (a的p次方-a)一定是p的倍数

            a^(p-1)-1 一定是p的倍数

            a^(p-1) =1(mod p)   这里 a的p-1次方 和1对p取余相等

    通过杨辉三角进行证明

    而杨辉三角是什么,杨辉三角,则是由左上和右上的两个数进行相加得到的数,

    上面的杨辉三角满足的公式就是下面的,从1开始这个公式  x+1; x^2+2*x+1;往下进行推导

     上面的杨辉三角满足的特性

    其中只看质数这一个的时候,中间的数据,都等于当前数的倍数,这也算是一个规律。

     1,3,5,7.。。。,也就是刚才的规律。

     

     

     归纳法中是正确的。

    然后欧拉提出了一个欧拉总计函数

    也就是n取正整数,在<=n的正整数中,计算与n互质的个数 计成fn(8)=4,互质,没有公约数,比如说小于8的 质数 就为4个,

     7为质数,求7的互为质数,那就 一定有n -1个互为公约数。 把n分解为两个素数

     则下面的

     最后欧拉推出来,并不需要一定是质数,但是只需要是有相同的公约数就行了。

    RSA算法推论

    通过前面的时间公式  往下进行推

     而这个d是未知数, 然后得到的结果

    然后同时乘以m

     提多项式

     欧拉定理

    RSA的推导算法

     加密和解密的公钥也是利用的这个公式

     

    公钥的生成

    生成私钥的方式

     

    然后加密过的数据

     

     事实上,如果n足够大,需要几千年才能破解。

     结语

    最后本篇主要是介绍的是银行常用的hash算法,和非对称加密算法,其中涉及包括hash算法中按非线性组合,和rsa算法中应用了费马定理。以及改进的欧拉定理,怎么推出的rsa算法;下篇文章我会介绍对称加密,及在jdk中应用的各种api实现

    加密算法之对称加密(AES加密) 及在jdk中应用

    展开全文
  • 题解:由于字符串长度为1e5且问的次数也有1e5,所以暴力肯定是会超时的,然后考虑用树状数组维护字符串的hash值来解,两个操作分别用正反方向区间比对哈希值和单点改动。 #include &lt;cstdio&gt; #incl...

    题意:给出一个字符串。有两种操作,一个是p a b,问字符串从位置a到位置b的子串是否是一个回文子串。还有一个操作 c a b,把字符串位置a的字符替换为b。

    题解:由于字符串长度为1e5且问的次数也有1e5,所以暴力肯定是会超时的,然后考虑用树状数组维护字符串的hash值来解,两个操作分别用正反方向区间比对哈希值和单点改动。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define ULL unsigned long long
    using namespace std;
    const int N = 100005;
    int n, m, l, r, pos;
    char str[N], q[20], c;
    ULL C[N][2], Hash[N];
    
    int lowbit(int x) {
    	return x & (-x);
    }
    
    ULL Sum(int x, int y) {
    	ULL ret = 0;
    	while (x > 0) {
    		ret += C[x][y];
    		x -= lowbit(x);
    	}
    	return ret;
    }
    
    void Add(int x, ULL d, int y) {
    	while (x <= n) {
    		C[x][y] += d;
    		x += lowbit(x);
    	}
    }
    
    int main() {
    	Hash[0] = 1;
    	for (int i = 1; i < N; i++)
    		Hash[i] = Hash[i - 1] * 27;//都是小写字母
    	while (scanf("%s", str) == 1) {
    		memset(C, 0, sizeof(C));
    		n = strlen(str);
    		for (int i = 0; i < n; i++) {
    			Add(i + 1, (str[i] - 'a') * Hash[i], 0);
    			Add(i + 1, (str[n - i - 1] - 'a') * Hash[i], 1);
    		}
    		scanf("%d", &m);
    		while (m--) {
    			scanf("%s", q);
    			if (q[0] == 'p') {
    				scanf("%d%d", &l, &r);
    				ULL h1 = (Sum(r, 0) - Sum(l - 1, 0)) * Hash[n - r];
    				ULL h2 = (Sum(n - l + 1, 1) - Sum(n - r, 1)) * Hash[l - 1];
    				if (h1 == h2)
    					printf("Yes\n");
    				else
    					printf("No\n");
    			}
    			else {
    				scanf("%d %c", &pos, &c);
    				int x = c - str[pos - 1];
    				Add(pos, x * Hash[pos - 1], 0);
    				Add(n - pos + 1, x * Hash[n - pos], 1);
    				str[pos - 1] = c;
    			}
    		}
    	}
    	return 0;
    }


    展开全文
  • 一致性Hash算法(hash环)

    千次阅读 2017-12-01 15:37:07
    并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务,这是值得考虑的,尤其实在设计分布式缓存系统时,如果某台服务器失效,对于整个系统来说如果不采用合适的算法来...
  • "hash/crc32" "sort" "strconv" "sync" ) //申明切片类型 type units []uint32 //返回切片长度 func (x units) Len() int { return len(x) } //比较两个值的大小 func (x units) Less(i, j int) bool { ...
  • Hash算法及数字签名【6】 Hash 函数 Hash 函数主要用于数据完整性验证,如区块链中的 Merkel 树与根,网络传输的消息认证码等。 1、Hash函数的定义 将任意长的消息 M 映射为较短的、固定长度的一个值H(M)。Hash ...
  • 字符串匹配(hash算法) 转载 hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配。 首先我们会想一下二进制数。 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为...
  • 本书是算法领域的一部经典著作,书中系统、全面地介绍了现代算法:从较快算法和数据结构到用于看似难以解决问题的多项式时间算法;从图论中的经典算法到用于字符匹配、计算集合和数论的特殊算法。本书第3版尤其增加...
  • 我要记下来多项式hash 定义: 对于任意一个区间L,L+1,...,R KeyL=str[ L] +str[L+1]*K + str[L+2]* K^2 +...str[R] * K^(R-L) KeyR=str[R] +str[R-1]*K + str[R-2]* K^2 +...str[L] * K^(R-L) 只要是...
  • 文章目录InterValue抗量子哈希算法1.抗量子攻击的哈希算法2.抗量子攻击的数字签名算法InterValue分层共识机制1.HashNet共识2.BA-VRF共识 InterValue抗量子哈希算法 1.抗量子攻击的哈希算法 密码学中的哈希算法又...
  • Hash函数基本原理 Hash函数的定义 将任意长的消息M映射为较短的,固定长度的一个值H(M)的函数就是Hash函数。Hash函数也成为哈希函数、散列函数、压缩函数、杂凑函数、指纹函数、杂凑码、指纹、消息摘要。Hash函数H...
  • hash校验算法

    2016-12-20 14:34:07
    hash校验算法
  • 这道算法题算是非常简单了,直接用Hash思想即可解决问题。 代码如下: #include<stdio.h> int n; int s; int isFirst=1;//如果有格式要求,则定义是否是第一个,如果不是第一个就要先输出一个回车在输出数 int...
  • Go Hash

    2021-03-24 11:02:28
    哈希(Hash)也称为散列,是把任意长度的输入通过哈希算法变换为固定长度的输出,这个输出值也就是散列值。 哈希表是根据键值对(key value)而直接进行访问的数据结构,通过将键值对映射到表中一个位置来访问记录,以...
  • TSP旅行商问题各种算法实现

    万次阅读 多人点赞 2019-01-03 19:44:31
    遗传算法、模拟退火、蚁群算法、Hopfield神经网络、禁忌搜索,部分思路参考网络或者Paper。 //遗传算法解决TSP问题,35s # include &lt;bits/stdc++.h&gt; using namespace std; typedef long long LL; ...
  • 存在一定关系 hash[r]与hash[l - 1]中间相差了一定长度的字符串,其长度为r - l + 1 所以通过求出pow(b, r - l + 1),就可以求出从l到r的hashCode hashCode(l, r) = hash[r] - hash[l - 1] * pow(b, r - l + 1) 但...
  • HASH算法

    2019-09-24 04:55:14
    哈希表(Hash Table)是一种特殊的数据结构,它最大的特点就是可以快速实现查找、插入和删除。因为它独有的特点,Hash表经常被用来解决大数据问题,也因此被广大的程序员所青睐。为了能够更加灵活地使用Hash来提高...
  • Hash签名算法入门

    千次阅读 2018-09-12 10:11:28
    在这篇文章中主要讲述了签名算法的发展历程,分析了基于哈希函数的签名算法的原理及优缺点。 在过去的几年间,我有幸观察到两种矛盾又有吸引力的趋势。第一种是我们终于开始使用研究员花40年设计的密码学。从加密...
  • 全排列hash算法

    2016-11-22 13:55:24
    一种特殊的变进制数,它能够被用来实现 全排列的Hash函数,并且该Hash函数能够实现完美的防碰撞和空间利用(不会发生碰撞,且所有空间被完全使用,不多不少)。 我们考查这样一种变进制数:第1位逢2进1,第2位逢3...
  • 十一、从头到尾彻底解析Hash算法 十一(续)、倒排索引关键词Hash不重复编码实践 十二、快速排序算法 (快速排序算法3篇文章) 十二(续)、快速排序算法的深入分析 十二(再续):快速排序算法之所有版本的c/c++...
  • 字符串hash算法

    2016-10-05 14:18:00
    hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配。 首先我们会想一下二进制数。 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): hash用的也是...
  • 针对这一问题,提出了一种新的轨迹相似性度量模型,在考虑轨迹的时间和空间要素的同时,加入了轨迹的形状因素,可以在多项式时间内计算定义在不同时间跨度上的轨迹的距离,能够更加准确、快速地度量轨迹之间的相似性...
  • 目录前言一、问题引入 - 字符串匹配 - 滚动哈希二、滚动哈希 - Rabin-Karp 算法三、代码参考 前言 哈希是一个思想,将字符串看成高进制的数指,求出其哈希值,用其哈希值解决问题。 使用滚动哈希来求解字符串匹配...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,888
精华内容 1,555
关键字:

多项式hash 算法