【问题标题】:md5 hash or crc32 which one to use in this casemd5 hash 或 crc32 在这种情况下使用哪一个
【发布时间】:2011-08-14 21:50:55
【问题描述】:

我需要一个可以用少于 26 个字符表示的哈希 md5产生32个字符长的字符串,如果转换成base 36会有多好,

我需要哈希不是为了加密,而是为了唯一性,基本上根据输入和输入数据的时间来识别每个输入。目前我可以认为这是

        $hash=md5( str_ireplace(".","",microtime()).md5($input_data) )  ;
        $unique_id= base_convert($hash,16,36) ;

应该这样还是使用 crc32,它会提供更小的哈希大小,但我担心它不会那么独特?

【问题讨论】:

  • 出于好奇:为什么您的唯一 ID 限制为 26 个字符?
  • 您可能会在 md5 碰撞之前遇到 crc323 碰撞。但是,为了唯一性,我至少会使用 sha1。
  • 使用 sha-1 哈希,然后截断到所需的字符数是完全可以接受的。除非您要处理数十亿个项目,否则 26 个字符应该足以避免发生冲突。
  • 如果碰撞对你来说是个严重的问题,那么你可以排除 crc32。

标签: hash md5 uniqueidentifier crc32


【解决方案1】:

我认为可以采用更简单的解决方案。

根据您的说法,您有 26 个空格字符。然而,为了澄清我理解的性格和你理解的性格,让我们做一些挖掘。

MD5 哈希值。到维基百科产生 16 字节的哈希值。

CRC32 算法产生 4 字节哈希。

我将“字符”(最简单的意义上)理解为 ASCII 字符。每个 ascii 字符(例如 A = 65)是 8 位长。

MD5 算法产生 16 字节 * 每字节 8 位 = 128 位,CRC32 为 32 位。

您必须了解哈希在数学上不是唯一的,而是“可能是唯一的”。

因此,根据您的描述,我的解决方案是将散列的位表示为 ascii 字符。

如果您只能在 MD5 和 CRC32 之间进行选择,答案将是 MD5。但您也可以使用 SHA-1 160 位哈希

如果您关心每个哈希使用的符号集,那么两个哈希都在集合 [A-Za-z0-9] 中(我相信)。

最后,当您将本质上是数字的数字从一个基数转换为另一个基数时,数字不会改变,因此算法的强度不会改变;它只是改变了数字的表示方式。

【讨论】:

  • SHA1 和 MD5 都输出字节。显示它们的常用方法是十六进制,但对它们进行 base64 编码会使表示形式更短。
猜你喜欢
  • 2016-12-24
  • 2017-06-14
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多