现在 后 一 常见算法的杀一码算法都有哪些呢

博客分类:
DES算法为密码体制中的对称密码体制,又被成为数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其长度为56位。DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。1999年1月,与合作,在22小时15分钟内即公开破解了一个DES密钥。
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)的通称。它相当于是对每个数据块应用三次加密算法。由于计算机运算能力的增强,原版DES密码的变得容易被;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。 因为密钥长度增加,安全性比DES有所增强,但是性能有所下降
高级加密标准(Advanced Encryption Standard,AES),在中又称Rijndael加密法,是美国联邦政府采用的一种标准。这个标准用来替代原先的,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为中最流行的之一。截至2006年,针对AES唯一的成功攻击是。审核了所有的参与竞选AES的最终入围者(包括Rijndael),认为他们均能够满足美国政府传递非机密文件的安全需要。2003年6月,美国政府宣布AES可以用于加密机密文件。
国密 SM1 算法是由国家密码管理局编制的一种商用密码分组标准对称算法。 分组长度和密钥长度都为 128 比 特,算法安全保密强度及相关软硬件实现性能与 AES 相当,该算法不公开,仅以 IP 核的形式存在于芯片中。采用该算法已经研制了系列芯片、智能 IC 卡、智能密码钥匙、加密卡、加 密 机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。
SSF33算法是由国家密码管理局编制的一种商用密码分组标准对称算法,分组长度和密钥长度都为 128比特,该算法不公开,仅以 IP 核的形式存在于芯片中。但是SSF33算法性能比较差,因此在实用中,逐步被SM1、SM4代替。
MD5即Message-Digest Algorithm 5(信息-摘要 5),用于确保信息传输完整一致。MD5一度被广泛应用于安全领域。但是由于MD5的弱点被不断发现以及计算机能力不断的提升,现在已经可以构造两个具有相同MD5的信息,使本算法不再适合当前的安全环境。2004年,证明MD5数字签名算法可以产生碰撞。2007年,Marc Stevens,Arjen K. Lenstra和Benne de Weger进一步指出通过伪造软件签名,可重复性攻击MD5算法。研究者使用前缀碰撞法(chosen-prefix collision),使程序前端包含恶意程序,利用后面的空间添上垃圾代码凑出同样的MD5 Hash值。
2008年,荷兰埃因霍芬技术大学科学家成功把2个可执行文件进行了MD5碰撞,使得这两个运行结果不同的程序被计算出同一个MD5。2008年12月一组科研人员通过MD5碰撞成功生成了伪造的SSL证书,这使得在https协议中服务器可以伪造一些根CA的签名。
SHA1/SHA2算法:
SHA算法是一种能计算出一个数位讯息所对应到的,长度固定的字串(又称讯息摘要)的算法。SHA-1在许多安全协定中广为使用,包括和、、、和,曾被视为是(更早之前被广为使用的杂凑函数)的后继者。SHA2包括SHA224、SHA-256,SHA-384和SHA-512。摘要算法运行很快,其中SHA2的性能略低于SHA1。
RSA加密算法是一种。在和中RSA被广泛使用。对极大整数做的难度决定了RSA算法的可靠性。今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在和理论日趋成熟的今天,RSA加密安全性受到了挑战。
比起和其它来说,RSA要慢得多。实际上Bob一般使用一种对称算法来加密他的信息,然后用RSA来加密他的比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息送给Alice。
2010年成功分解了RSA-768私钥,2007年使用SNFS分解了1039位长的特殊整数。NIST的说法是,1024位密钥只能使用到2010年底。
椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC)是基于的一种的方法。椭圆曲线在密码学中的使用是在1985年由和分别独立提出的。
ECC的主要优势是在某些情况下它比其他的方法使用更小的——比如——提供相当的或更高等级的安全。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
SM2算法是国家密码管理局编制的一种商用密码非对称算法,基于ECC算法。安全性与Nist Prime256相当。与ECC的缺点一样,性能较低。2010年,国密局公开SM2算法。
SM2算法是国家密码管理局编制的一种商用密码摘要算法,安全性与效率与SHA256相当。2010年,国密局公开SM3算法。
浏览: 194797 次
来自: 北京
所以新增ibatis这么流行. 做hibernate的团队应该 ...
谢谢大家的回复。这一篇故意这么写,也就是发一发牢骚。本来专业技 ...
仔细看看,在困难面前唐僧,八戒,沙僧是不是都被困住!是不是?
这个题目我认为没有什么问题,首先题目本身就是前提条件,就好像数 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'软件编程经常用的算法都有哪些?_百度知道
软件编程经常用的算法都有哪些?
我有更好的答案
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
在计算机科学所使用的排序算法通常被分类为:
计算的复杂度(最差、平均、和最好表现),依据串列(list)的大小(n)。一般而言,好的表现是O。(n log n),且坏的行为是Ω(n2)。对於一个排序理想的表现是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要Ω(n log n)。
记忆体使用量(以及其他电脑资源的使用)
稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的串列中R出现在S之前,在排序过的串列中R也将会是在S之前。
一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序(bubble sort)和快速排序(quicksort)。选择排序包含shaker排序和堆排序(heapsort)。
当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
(4, 1) (3, 1) (3, 7) (5, 6)
在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:
(3, 1) (3, 7) (4, 1) (5, 6) (维持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改变)
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地时作为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个物件间之比较,就会被决定使用在原先资料次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
排列算法列表
在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。
冒泡排序(bubble sort) — O(n2)
鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) — O(n2)
插入排序 (insertion sort)— O(n2)
桶排序 (bucket sort)— O(n); 需要 O(k) 额外 记忆体
计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外 记忆体
归并排序 (merge sort)— O(n log n); 需要 O(n) 额外记忆体
原地归并排序 — O(n2)
二叉树排序 (Binary tree sort) — O(n log n); 需要 O(n) 额外记忆体
鸽巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 额外记忆体
基数排序 (radix sort)— O(n·k); 需要 O(n) 额外记忆体
Gnome sort — O(n2)
Library sort — O(n log n) with high probability, 需要 (1+ε)n 额外记忆体
选择排序 (selection sort)— O(n2)
希尔排序 (shell sort)— O(n log n) 如果使用最佳的现在版本
Comb sort — O(n log n)
堆排序 (heapsort)— O(n log n)
Smoothsort — O(n log n)
快速排序 (quicksort)— O(n log n) 期望时间, O(n2) 最坏情况; 对於大的、乱数串列一般相信是最快的已知排序
Introsort — O(n log n)
Patience sorting — O(n log n + k) 最外情况时间, 需要 额外的 O(n + k) 空间, 也需要找到最长的递增子序列(longest increasing subsequence)
不实用的排序算法
Bogo排序 — O(n × n!) 期望时间, 无穷的最坏情况。
Stupid sort — O(n3); 递回版本需要 O(n2) 额外记忆体
Bead sort — O(n) or O(√n), 但需要特别的硬体
Pancake sorting — O(n), 但需要特别的硬体
排序的算法
排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。
插入排序是这样实现的:
首先新建一个空列表,用于保存已排序的有序数列(我们称之为&有序列表&)。
从原数列中取出一个数,将其插入&有序列表&中,使其仍旧保持有序状态。
重复2号步骤,直至原数列为空。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了&逐步扩大成果&的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
冒泡排序是这样实现的:
首先将所有待排序的数字放入工作列表中。
从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
重复2号步骤,直至再也不能交换。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。
选择排序是这样实现的:
设数组内存放了n个待排数字,数组下标从1开始,到n结束。
从数组的第i个元素开始到第n个元素,寻找最小的元素。
将上一步找到的最小元素和第i位元素交换。
如果i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n²)的。
现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而&保证列表的前半部分都小于后半部分&就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
堆排序与前面的算法都不同,它是这样的:
首先新建一个空列表,作用与插入排序中的&有序列表&相同。
找到数列中最大的数字,将其加在&有序列表&的末尾,并将其从原数列中删除。
重复2号步骤,直至原数列为空。
堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得&找到数列中最大的数字&这样的操作只需要O(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。
看起来似乎堆排序与插入排序有些相像,但他们其实是本质不同的算法。至少,他们的时间复杂度差了一个数量级,一个是平方级的,一个是对数级的。
平均时间复杂度
插入排序 O(n2)
冒泡排序 O(n2)
选择排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
基数排序 O(n)
希尔排序 O(n1.25)
比如说这个,我想让它从小到大排序,怎么做呢?
第一步:6跟5比,发现比它大,则交换。564
第二步:5跟4比,发现比它大,则交换。465
第三步:6跟5比,发现比它大,则交换。456
采纳率:40%
为您推荐:
其他类似问题
您可能关注的内容
软件编程的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。常见的算法有哪些
栈:栈是一种先进后出的数据结构。
首先说明,&java中的基本数据类型一定存储在栈中的吗?&这句话肯定是错误的
一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因
在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。
(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在JAVA栈中
(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在JAVA虚拟机的栈中,该变量所指向的对象是放在堆类存中的。
二:在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。
同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量
(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的
(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中
队列:是一种先进先出的数据结构。
数组:.数组是相同数据类型的元素的集合,具有查询快,增删慢的特点。
链表:链表就是链式存储的线性表。根据指针域的不同,链表分为单向链表、双向链表、循环链表等等。
1、如何判断一个单链表有环
2、如何判断一个环的入口点在哪里
3、如何知道环的长度
4、如何知道两个单链表(无环)是否相交
5、如果两个单链表(无环)相交,如何知道它们相交的第一个节点是什么
6、如何知道两个单链表(有环)是否相交
7、如果两个单链表(有环)相交,如何知道它们相交的第一个节点是什么
1、采用快慢步长法。令两个指针p和q分别指向头结点,p每次前进一步,q每次前进两步,如果p和q能重合,则有环。可以这么理解,这种做法相当于p静止不动,q每次前进一步,所有肯定有追上p的时候。
我们注意到,指针p和q分别以速度为1和2前进。如果以其它速度前进是否可以呢?
假设p和q分别以速度为v1和v2前进。如果有环,设指针p和q第一次进入环时,他们相对于环中第一个节点的偏移地址分别为a和b(可以把偏移地址理解为节点个数)
这样,可以看出,链表有环的充要条件就是某一次循环时,指针p和q的值相等,就是它们相对环中首节点的偏移量相等。我们设环中的结点个数为n,程序循环了m次。
由此可以有下面等式成立:(mod(n)即对n取余)
(a+m*v1)mod(n) = (b+m*v2) mod(n)
设等式左边mod(n)的最大整数为k1,等式右边mod(n)的最大整数为k2,则
(a+m*v1)-k1*n = (b+m*v2)-k2*n
整理以上等式:
m= |((k2-k1)*n+a-b)/( v2-v1)| ①
如果是等式①成立,就要使循环次数m为一整数。显然如果v2-v1为1,则等式成立。
这样p和q分别以速度为v1和v2且|v2-v1|为1时,按以上算法就可找出链表中是否有环。当然|v2-v1|不为1时,也可能可以得出符合条件的m。
[cpp] view plain copy
bool IsExitsLoop(slist *head)
slist *slow = head, *fast =
while ( fast && fast-&next )
slow = slow-&
fast = fast-&next-&
if ( slow == fast )
return !(fast == NULL || fast-&next == NULL);
时间复杂度分析:假设甩尾(在环外)长度为 len1(结点个数),环内长度为 len2,链表总长度为n,则n=len1+len2 。当p步长为1,q步长为2时,p指针到达环入口需要len1时间,p到达入口后,q处于哪里不确定,但是肯定在环内,此时p和q开始追赶,q最长需要len2时间就能追上p(p和q都指向环入口),最短需要1步就能追上p(p指向环入口,q指向环入口的前一个节点)。事实上,每经过一步,q和p的距离就拉近一步,因此,经过q和p的距离步就可以追上p。因此总时间复杂度为O(n),n为链表的总长度。
2、分别从链表头和碰撞点,同步地一步一步前进扫描,直到碰撞,此碰撞点即是环的入口。
证明如下:
链表形状类似数字 6 。
假设甩尾(在环外)长度为 a(结点个数),环内长度为 b 。
则总长度(也是总结点数)为 a+b 。
从头开始,0 base 编号。
将第 i 步访问的结点用 S(i) 表示。i = 0, 1 &
当 i<a 时,S(i)=i ;
当 i&a 时,S(i)=a+(i-a)%b 。
分析追赶过程。
两个指针分别前进,假定经过 x 步后,碰撞。则有:S(x)=S(2x)
由环的周期性有:2x=tb+x 。得到 x=tb 。
另,碰撞时,必须在环内,不可能在甩尾段,有 x&=a 。
连接点为从起点走 a 步,即 S(a)。
S(a) = S(tb+a) = S(x+a)。
得到结论:从碰撞点 x 前进 a 步即为连接点。
根据假设易知 S(a-1) 在甩尾段,S(a) 在环上,而 S(x+a) 必然在环上。所以可以发生碰撞。
而,同为前进 a 步,同为连接点,所以必然发生碰撞。
综上,从 x 点和从起点同步前进,第一个碰撞点就是连接点。
[cpp] view plain copy
slist* FindLoopPort(slist *head)
slist *slow = head, *fast =
while ( fast && fast-&next )
slow = slow-&
fast = fast-&next-&
if ( slow == fast )
if (fast == NULL || fast-&next == NULL)
return NULL;
while (slow != fast)
slow = slow-&
fast = fast-&
时间复杂度分析:假设甩尾(在环外)长度为 len1(结点个数),环内长度为 len2 。则时间复杂度为&环是否存在的时间复杂度&+O(len1)
3、从碰撞点开始,两个指针p和q,q以一步步长前进,q以两步步长前进,到下次碰撞所经过的操作次数即是环的长度。这很好理解,比如两个运动员A和B从起点开始跑步,A的速度是B的两倍,当A跑玩一圈的时候,B刚好跑完两圈,A和B又同时在起点上。此时A跑的长度即相当于环的长度。
假设甩尾(在环外)长度为 len1(结点个数),环内长度为 len2 ,则时间复杂度为&环是否存在的时间复杂度&+O(len2)。
4、法一:将链表A的尾节点的next指针指向链表B的头结点,从而构造了一个新链表。问题转化为求这个新链表是否有环的问题。
时间复杂度为环是否存在的时间复杂度,即O(length(A)+length(B)),使用了两个额外指针
法二:两个链表相交,则从相交的节点起,其后的所有的节点都是都是两个链表共有的。因此,如果它们相交,则最后一个节点一定是共有的。因此,判断两链表相交的方法是:遍历第一个链表,记住最后一个节点。然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交。
时间复杂度:O(length(A)+length(B)),但是只用了一个额外指针存储最后一个节点
5、将链表A的尾节点的next指针指向链表B的头结点,从而构造了一个环。问题转化为求这个环的入口问题。
时间复杂度:求环入口的时间复杂度
6、分别判断两个链表A、B是否有环(注,两个有环链表相交是指这个环属于两个链表共有)
如果仅有一个有环,则A、B不可能相交
如果两个都有环,则求出A的环入口,判断其是否在B链表上,如果在,则说明A、B相交。
时间复杂度:&环入口问题的时间复杂度&+O(length(B))
7、分别计算出两个链表A、B的长度LA和LB(环的长度和环到入口点长度之和就是链表长度),参照问题3。
如果LA&LB,则链表A指针先走LA-LB,链表B指针再开始走,则两个指针相遇的位置就是相交的第一个节点。
如果LB&LA,则链表B指针先走LB-LA,链表A指针再开始走,则两个指针相遇的位置就是相交的第一个节点。
时间复杂度:O(max(LA,LB))

我要回帖

更多关于 常见算法面试题 的文章

 

随机推荐