Hash md5哈希或crc32在这种情况下使用哪一个

Hash md5哈希或crc32在这种情况下使用哪一个,hash,md5,uniqueidentifier,crc32,Hash,Md5,Uniqueidentifier,Crc32,我需要一个哈希,可以在不到26个字符表示 Md5生成32个字符的长字符串,如果将其转换为性能如何 我需要散列不是为了加密,而是为了唯一性,基本上识别每个输入依赖于输入时间和输入数据。现在我可以把这看作是 $hash=md5( str_ireplace(".","",microtime()).md5($input_data) ) ; $unique_id= base_convert($hash,16,36) ; 您应该这样做,还是使用crc32,它将提供较小的哈

我需要一个哈希,可以在不到26个字符表示 Md5生成32个字符的长字符串,如果将其转换为性能如何

我需要散列不是为了加密,而是为了唯一性,基本上识别每个输入依赖于输入时间和输入数据。现在我可以把这看作是

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

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

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

根据你的陈述,你有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](我相信)中


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

我认为可能会有一个更简单的解决方案

根据你的陈述,你有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](我相信)中


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

出于好奇:为什么您的唯一id限制为26个字符?在md5冲突之前,您可能会遇到crc323冲突。但是,我至少会使用sha1来表示唯一性。使用sha-1散列,然后截断到所需的字符数是完全可以接受的。26个字符会使冲突变得非常不可能,除非您处理的是数十亿个项目。如果冲突对您来说是一个严重问题,那么您可以排除crc32。出于好奇:为什么您的唯一id限制为26个字符?在md5冲突之前,您可能会遇到crc323冲突。但是,我至少会使用sha1来表示唯一性。使用sha-1散列,然后截断到所需的字符数是完全可以接受的。26个字符会使冲突变得非常不可能,除非您处理的是数十亿项。如果冲突对您来说是一个严重问题,那么您可以排除crc32。SHA1和MD5都输出字节。显示它们的常用方法是十六进制,但对它们进行base64编码会使表示更短。SHA1和MD5都输出字节。显示它们的常用方法是十六进制,但对它们进行base64编码会使表示时间缩短很多。