第6章 第8节 高级算法

推荐给朋友

● 请问加密方法都有哪些

参考回答:

考察点:密码学

公司:腾讯

1、单向加密

单向加密又称为不可逆加密算法,其密钥是由加密散列函数生成的。单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:


MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文;

SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值。其变种由SHA192,SHA256,SHA384等;

CRC-32,主要用于提供校验功能;

算法特征:

输入一样,输出必然相同;

雪崩效应,输入的微小改变,将会引起结果的巨大变化;

定长输出,无论原始数据多大,结果大小都是相同的;

不可逆,无法根据特征码还原原来的数据;

2、对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

特点:

1、加密方和解密方使用同一个密钥;

2、加密解密的速度比较快,适合数据比较长时的使用;

3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;

优点:对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

缺点:对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

3、非对称加密

非对称密钥加密也称为公钥加密,由一对公钥和私钥组成。公钥是从私钥提取出来的。可以用公钥加密,再用私钥解密,这种情形一般用于公钥加密,当然也可以用私钥加密,用公钥解密。常用于数字签名,因此非对称加密的主要功能就是加密和数字签名。

特征:

1)秘钥对,公钥(public key)和私钥(secret key)

2)主要功能:加密和签名

发送方用对方的公钥加密,可以保证数据的机密性(公钥加密)。

发送方用自己的私钥加密,可以实现身份验证(数字签名)。

3)公钥加密算法很少用来加密数据,速度太慢,通常用来实现身份验证。

常用的非对称加密算法

RSA:由 RSA公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;既可以实现加密,又可以实现签名。

DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)。

ECC(Elliptic Curves Cryptography):椭圆曲线密码编码。

● 什么是LRU缓存

参考回答:


LRU(最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高
实现:使用一个链表保存缓存数据,将新数据插入到头部,每当缓存命中时,则将命中的数据移动到链表头部,当链表满的时候,将链表尾部的数据丢弃。

● 请你说一说洗牌算法

参考回答:

考察点:

公司:腾讯

1、Fisher-Yates Shuffle算法

最早提出这个洗牌方法的是 Ronald A. Fisher 和 Frank Yates,即 Fisher–Yates Shuffle,其基本思想就是从原始数组中随机取一个之前没取过的数字到新的数组中,具体如下:

1)初始化原始数组和新数组,原始数组长度为n(已知)。

2)从还没处理的数组(假如还剩k个)中,随机产生一个[0, k)之间的数字p(假设数组从0开始)。

3)从剩下的k个数中把第p个数取出。

4)重复步骤2和3直到数字全部取完。

5)从步骤3取出的数字序列便是一个打乱了的数列。

时间复杂度为O(n*n),空间复杂度为O(n)。

2)Knuth-Durstenfeld Shuffle

Knuth 和 Durstenfeld  在Fisher 等人的基础上对算法进行了改进,在原始数组上对数字进行交互,省去了额外O(n)的空间。该算法的基本思想和 Fisher 类似,每次从未处理的数据中随机取出一个数字,然后把该数字放在数组的尾部,即数组尾部存放的是已经处理过的数字。

算法步骤为:

1. 建立一个数组大小为 n 的数组 arr,分别存放 1 到 n 的数值;

2. 生成一个从 0 到 n - 1 的随机数 x;

3. 输出 arr 下标为 x 的数值,即为第一个随机数;

4. 将 arr 的尾元素和下标为 x 的元素互换;

5. 同2,生成一个从 0 到 n - 2 的随机数 x;

6. 输出 arr 下标为 x 的数值,为第二个随机数;

7. 将 arr 的倒数第二个元素和下标为 x 的元素互换;

……

如上,直到输出m 个数为止

时间复杂度为O(n),空间复杂度为O(1),缺点必须知道数组长度n。