【问题标题】:Is CRC-32 guaranteed to generate 4 billion unique values?CRC-32 是否保证生成 40 亿个唯一值?
【发布时间】:2019-06-25 07:59:48
【问题描述】:

我只想知道对于一个 CRC32 哈希函数,特别是 PHP crc 函数,我是否会得到 2^32(40 亿)个不同的输入值(整数)值,保证从 1 开始按顺序递增到 40 亿?

【问题讨论】:

标签: php hash cryptography crc32


【解决方案1】:

我不认为 CRC32 是专门为所有可能的四字节输入不发生冲突而设计的。然而,它似乎确实是这样工作的。您可以通过简单地检查每个可能的输出来自己验证这一点。为了加快速度,我使用了以下 C 程序:

/* Compile: cc crc_check.c -O3 -lz -o crc_check */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <zlib.h>

int main() {
    uint32_t x, y, d;
    uint64_t i, *seen, mask;

    seen = calloc(0x4000000, 8);
    if (!seen) return -1;

    /* Make sure we're calculating the same values as PHP's crc32 function */
    printf("crc32(\"ABCD\") = %lu\n", crc32(0, (unsigned char*)"ABCD", 4));

    for (i=x=0; i<0x100000000ULL; i++) {
        y = crc32(0, (unsigned char*)(&x), 4);
        mask = 1ULL << (y & 0x003fULL);
        d = y >> 6;
        if (seen[d] & mask) {
            printf("Collision detected (x=%u, y=%u)\n", x, y);
            return 0;
        }
        seen[d] |= mask;
        x++;
    }
    puts("No collisions detected");
    return 0;
}

/*
   Output:
   crc32("ABCD") = 3675725989
   No collisions detected
*/

为了确保 zlib 使用相同的功能,我添加了一行来输出字符串“ABCD”的 CRC32 校验和。 PHP 产生相同的值:

$ php -r 'echo crc32("ABCD");'
3675725989

不过,我不得不问:您需要这些信息做什么?如果您想将连续的 32 位整数转换为唯一的伪随机值,有很多更有效的方法可以做到这一点。例如,考虑使用linear congruential generator

【讨论】:

  • 感谢您的回答。我正在尝试创建一个 URL 缩短服务,例如 goo.gl。所以我基本上是在尝试将 CRC 散列数指定为缩短的 URL。所以基本上,我想知道我是否能够生成 40 亿个不同的 URL 而不必担心重复/冲突
  • 好的,但是 CRC32 函数对此有何帮助?您所做的只是以一种相当复杂的方式将一个 32 位数字转换为另一个 32 位数字。 (也许我应该指出,只有在处理原始字节值时,CRC 校验和才是唯一的;即$crc_value = crc32(pack("L",$counter_value));。编写一个将整数值转换为 base-62 字符串的函数不是更好吗? (使用字符 0-9、a-z 和 A-Z 作为数字)?
  • CRC32 有助于将数字转换为 4 个字符的字符串,例如。 f38d。这就是我使用哈希的原因。
  • 不,这行不通。如果您只是将数值变量传递给此函数,则会有很多冲突,例如crc32(86821) == crc32(14740600)。仅当您传递与每个数字的二进制表示的原始字节相对应的 4 字符字符串时,结果才是唯一的($crc_value = crc32(pack("L",$counter_value));,如上所述)。
猜你喜欢
  • 2011-11-01
  • 2020-07-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多