【问题标题】:What is the possibility of CRC16 collisions on 20 bytes of data?20 字节数据发生 CRC16 冲突的可能性有多大?
【发布时间】:2012-12-22 00:35:29
【问题描述】:

我正在开发一个系统,该系统需要为长度为 20 个字节的结构存储散列可能更少。但是,为了优化在一系列哈希中查找哈希的过程,我们希望尽可能减小哈希的大小。

所以我的问题是,我们输入 crc16 哈希的数据量与其与另一个相同长度条目发生冲突的概率之间是否存在关系?如果是这样,哪个是最优化的长度?

18 个字节在 ascii 表中(a-z,0-9),其余的范围在 0 到 10 之间

【问题讨论】:

  • 只是为了确保...您的哈希可以处理冲突,对吗?也就是说,如果最终发生冲突,则将所有内容存储在同一个键中,然后进行二次搜索以解决歧义和索引?
  • 是的,has 系统可以处理哈希冲突。
  • 好的;我知道这听起来像是一个愚蠢的问题,但我必须确保:)

标签: security hash crc16


【解决方案1】:

以下简单脚本运行一个无限循环,该循环获取 2 个随机 20 字节序列,计算 CRC16 并检查是否存在冲突。这个循环的连续评估事实上估计了碰撞百分比:

#!/usr/bin/env perl

use Digest::CRC qw(crc16);

open(my $f, '<', '/dev/urandom');
my $n = 0;
my $coll = 0;

while (1) {
    read $f, $randstr1, 20;
    read $f, $randstr2, 20;
    my $crc1 = crc16($randstr1);
    my $crc2 = crc16($randstr2);

    $n++;
    $coll++ if $crc1 == $crc2;

    printf "percent of collisions = %.6f%%\n", $coll * 100.0 / $n if ($n % 100000 == 0);
}

根据我在计算机上获得的信息,碰撞百分比似乎在 0.0016%(或 1e-5,或“100_000 分之一”)左右,这比基于预测的估计要差 16 位散列的理想散列分布(例如 2^16 / 2^160)。

更新:我看到你已经澄清了 20 个字节不仅仅是完全随机的字节,而是属于[a-z0-9] 的范围。这是估计该字母表中的冲突的更新版本:

#!/usr/bin/env perl

use Digest::CRC qw(crc16);

my $n = 0;
my $coll = 0;
my @chars = ('a'..'z', '0'..'9');

sub randstr() {
    my $res;
    foreach (1..20) { $res .= $chars[rand @chars]; }
    return $res;
}

while (1) {
    my $crc1 = crc16(randstr());
    my $crc2 = crc16(randstr());

    $n++;
    $coll++ if $crc1 == $crc2;

    printf "percent of collisions = %.4f%%\n", $coll * 100.0 / $n if ($n % 100000 == 0);
}

它产生的结果大致相同,大约是0.0016%

【讨论】:

  • 理论上,randstr() 可以连续两次返回相同的字符串,所以你真的应该将每个字符串保存到一个变量中,如果你遇到冲突,只有当它们不匹配时才增加。否则,您所做的只是证明时不时地重复相同的随机字符串(或存在冲突)。或者不要使用随机,但是(这会非常慢)迭代每个可能的组合
【解决方案2】:

给定两个不同的输入,一个好的 16 位散列应该有 2^-16 的碰撞概率。 CRC16 不是一个很好的哈希,但除非你有对手选择输入,否则它应该足以满足你的目的。

请记住birthday paradox。散列大约 2^8 个项目后,您将开始发生冲突。

【讨论】:

    【解决方案3】:

    您是否遇到可能的哈希冲突取决于数据的内容,而不是其数量。如果不是故意选择碰撞,那么在这种数据大小是哈希大小的 10 倍的情况下,你应该是相当安全的。也就是说,它仍然是 16 位散列,按照现代标准,发生冲突的可能性非常高。

    【讨论】:

      【解决方案4】:

      散列冲突的概率不取决于消息的长度,只要消息的熵(有效位数)大于或等于散列中的位数,并且它是一个很好的散列,可以很好地将输入的位混合到每个散列中。

      在您的情况下,您有大约 100 位的熵,因此只要您有一个长度为 100 位或更短的良好哈希,那么冲突概率将仅取决于哈希中的位数和机会数你有碰撞。 This answer 展示了如何计算碰撞概率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2015-09-12
        • 2017-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多