1

我需要一个可以用少于 26 个字符表示的哈希 Md5 产生 32 个字符长的字符串,如果将其转换为基数 36会有多好,

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

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

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

4

1 回答 1

1

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

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

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

CRC32 算法产生 4 个字节的哈希值。

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

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

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

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

如果您只能在 MD5 和 CRC32 之间进行选择,答案将是 MD5。但是您也可以使用 SHA-1 160 位哈希 < 26 个字符串(长度为 20 个 ascii 字符)。

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

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

于 2011-08-14T22:47:16.830 回答