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

 

// 计算随机情况下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;
}

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页