一、散列函数有哪些特性使之能应用在数字签名中

所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的.这个特性是散列函数具有确定性的结果.但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但并不能绝对肯定二者一定相等.输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值.

典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串.在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的一一对应.一一对应的散列函数也称为排列.可逆性可以通过使用一系列的对于输入值的可逆「混合」运算而得到。构造散列函数的目标是使散列地址尽可能均匀分布在散列空间上,同时使计算尽可能简单,以节省计算时间。以关键字K本身或关键字加上某个数值常量C作为散列地址的方法,对应的散列函数:h(K)=K+C单向散列函数是进行数据加密/编码的一种算法

单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,MD5被广泛使用,可以用来把不同长度的数据块进行暗码运算成一个128位的数值;

二、什么是c******函数签名

参数就是函数传入的初始变量值,比如int func(int a);其中a就是参数,此时叫形式参数,只是表明参数的类型。当你调用时,比如func(1);这个1就是个实际参数,表明把1作为func的参数自变量就是所谓的默认参数。当一个函数你使用的时候,可能要传不同的值,但是你还要有个默认值,就是没有参数的时候也用这个值。

比如一个函数计算圆的周长,para表示圆周率,默认用3.14,但是有时候你可能要精确计算,就要让para=3.1415926, int func(int a,int para= 3.14)这样,当你使用的时候,如果不给para赋值,只写func(3),那么实际上编译器写进去的就是func(3,3.14)当你需要用其他值的时候自行传入。但有一点需要注意的是,当你有多个默认参数的时候,函数只支持从右往左的默认参数,比如int func(int a,int b=1,int c=2);这样是可以的,但是int func(int a=1,int b,int c=2)就不行了,这和参数入栈顺序有关。

所以要写默认参数,就要放在最右边函数签名就是编译器给函数的一个标签,就好像是你买食品上的配方一样。比如 int func(int a,int b);编译器不关心a和b,他俩只是个代号而已,只关心函数的返回类型和参数类型,所以函数签名编译器就写成了int func(int,int);这个在C++里面主要和函数重载有关系,当你的函数名相同时,只要函数签名不同编译器就认为你重载了函数,就不会报错,同样签名函数的两个函数会被报错。