【问题标题】:Generalised Birthday Calculation Given Hash Length给定哈希长度的广义生日计算
【发布时间】:2012-06-13 14:42:26
【问题描述】:

假设我们得到以下内容:

  • 哈希的长度
  • 获得碰撞的机会

现在,知道了以上内容,我们如何获得获得给定机会百分比所需的“样本”数量?

【问题讨论】:

    标签: hash birthday-paradox


    【解决方案1】:

    这里有一个小的 javascript 函数来计算机会,基于来自https://preshing.com/20110504/hash-collision-probabilities/(感谢链接@Frank)的“简化近似”算法来计算碰撞机会,并使用Decimal.js bignum library 来管理更大超过 Javascript 的 Number 可以处理的数字,例如:

    samples=2**64; //
    hash_size_bytes=20; // 160 bit hash
    number_of_possible_hashes=Decimal("2").pow(8*hash_size_bytes);
    console.log(collision_chance(samples,number_of_possible_hashes));
    // ~ 0.00000001 % chance of a collision with 2**64 samples and 20-byte-long hashes.
    samples=77163;
    hash_size_bytes=4; // 32bit hash
    number_of_possible_hashes=Decimal("2").pow(8*hash_size_bytes);
    console.log(collision_chance(samples,number_of_possible_hashes));
    // ~ 49.999% chance of a collision for a 4-byte hash with 77163 samples.
    

    功能:

    // with https://github.com/MikeMcl/decimal.js/blob/master/decimal.min.js
    function collision_chance(samples,number_of_possible_hashes){
        var Decimal100 = Decimal.clone({ precision: 100, rounding: 8 });
        var k=Decimal100(samples);
        var N=Decimal100(number_of_possible_hashes);
        var MinusK=Decimal100(samples);
        MinusK.s=-1;
        var ret=((MinusK.mul(k.sub(1))).div(N.mul(2))).exp();
        ret=ret.mul(100);
        ret=Decimal100(100).sub(ret);
        return ret.toFixed(100);
    }
    

    【讨论】:

      【解决方案2】:

      当我们将Simplified formula 用于生日悖论时,我们得到:

      probability = k^2/2N
      

      所以:

      sqr(probability*2*n) = k
      

      我们知道 n = 2^lenghtHash

      一个小测试: 哈希 = 16 位:N= 65536 概率 = 50% = 0.5

      sqr(0.5*2*65536) = 256 samples

      这不是 100% 正确的,因为我们从简化公式开始,但对于大散列和较大的样本集,它非常接近。

      有关公式的链接,您可以查看here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2015-03-30
        相关资源
        最近更新 更多