面试错题

请问object的hash该怎么设计?

下面是解释最简单的一种hash算法

哈希算法又叫散列算法,是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。它的原理其实很简单,就是把一段交易信息转换成一个固定长度的字符串。

即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。

无论输入是什么数字格式、文件有多大,输出都是固定长度的比特串。

每个bit就是一位0或者1,256bit就是256个0或者1二进制数字串,用16进制数字表示的话,就是多少位呢?

16等于2的4次方,所以每一位16进制数字可以代表4位bit。那么,256位bit用16进制数字表示,当然是256除以4等于64位。

于是你通常看到的哈希值,就是这样的了:

00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8。

易压缩:对于任意大小的输入x,Hash值的长度很小,在实际应用中,函数H产生的Hash值其长度是固定的。

易计算:对于任意给定的消息,计算其Hash值比较容易。

单向性:对于给定的Hash值,要找到使得在计算上是不可行的,即求Hash的逆很困难。在给定某个哈希函数H和哈希值H(M)的情况下,得出M在计算上是不可行的。即从哈希输出无法倒推输入的原始数值。这是哈希函数安全性的基础。

抗碰撞性:理想的Hash函数是无碰撞的,但在实际算法的设计中很难做到这一点。

有两种抗碰撞性:一种是弱抗碰撞性,即对于给定的消息,要发现另一个消息,满足在计算上是不可行的;另一种是强抗碰撞性,即对于任意一对不同的消息,使得在计算上也是不可行的。

高灵敏性:这是从比特位角度出发的,指的是1比特位的输入变化会造成1/2的比特位发生变化。消息M的任何改变都会导致哈希值H(M)发生改变。即如果输入有微小不同,哈希运算后的输出一定不同。

2不可逆加密阿呆:小星,你看这样可以不,我想一个A,经过下面的过程:

1.A+123=B

2.B^2=C

3.取C中第2~4位数,组成一个3位数D

4.D/12的结果求余数,得到E

小星:嗯,我想想,假如阿呆你想的A为5,那么:

5+123=128

128^2=16384

D=638 E=638mod12=53

(mod表示除法的求余数)

这种丢掉一部分信息的加密方式称为“单向加密”,也叫哈希算法

当两个不同的对象计算出相同的散列值时,我们称其为发生了 哈希碰撞 。当出现碰撞时,哈希表会从碰撞产生的位置开始向后寻找,把新的元素放在第一个可供放置的位置,随着哈希表变得越来越致密,发生碰撞的可能性也会随之增加,导致查找可用位置花费的时间也会增加(这也是为什么我们希望哈希函数的结果分布更接近于均匀分布)

http://www.sohu.com/a/232586831_100078137

哈希算法的实现方式很多,有兴趣的自己看吧

数据库三范式

 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;

第二范式(2NF):满足1NF后,,没有包含在主键中的列必须完全依赖于主键,不能只依赖于主键的一部分。

第三范式(3NF):必须先满足第二范式(2NF),非主键列必须直接依赖于主键不能存在传递依赖。

猜你喜欢

转载自www.cnblogs.com/zhulina-917/p/10921283.html