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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值