您的位置:首页 > 其它

计算随机情况下HASH发生碰撞的概率

2011-09-14 16:31 447 查看
 
// 计算随机情况下HASH碰撞率

// 不碰撞率

// f(N,1) = 1.0;

// f(N,2) = 1.0-1/N;

// f(N,k+1) = f(N,k)*(N-k)/N

// f(N,k) = (N-1)*(N-2)...(N-(k-1))/(N^(k-1))

// 大约算法:

// 根据: 当x接近0的时候, 1+x = e^x 

// 设 p = (k*k)/(2.0*N)

//  f(N,k) = 1.0/(e^p);

//

// 碰撞率: 1.0 - f(N,k)

// 来自:

// http://hi.baidu.com/%D1%BC%B5%B0%BF%C7%B6%F9/blog/item/92725df68332be2bbd31095d.html
 

 

 

// 经验数据

// 当 k*k  = N 的时候, 可近视认为碰撞率为 40%

 

#include "stdafx.h"

double getRate(long k, long N)

{

 if(k > N)

  return 1.0;

 if(k<=1)

  return 0.0;

 const double fN = N;

 double rate = 1.0;

 for (long i = N-1; i > N-k; i--)

 {

  rate *=  i/fN;

 }

 return 1-rate;

}

int _tmain(int argc, _TCHAR* argv[])

{

 double fk1 = getRate(23, 365);

 double fk2 = getRate(10000, 0x7FFFFFFF);

 double fk3 = getRate(100000, 0x7FFFFFFF);

 return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 c
相关文章推荐