php:快速转换varchar(32),包含0..9a..f到varchar([log [38] 16] +1)... 0..9A..z

时间:2011-11-29 09:01:59

标签: php hash md5 logarithm

假设我们有一个字符串md5('somestring')。它将包含符号0..f。因此,char(32)可以保存该哈希值,但我相信它可能不会超过21个字节([log 38 / log 236 + 1])* Length(hash)。任何快速函数将符号为0..f的字符串转换为符号为0..9A..z的字符串? (这将占用超过21个字节,因为它只使用数字和拉丁字母)?

2 个答案:

答案 0 :(得分:2)

更好:将结果散列为二进制。使用索引,二进制文件运行速度更快,速度更快。

使用mysql创建一个字段bin(16)。查询是这样的:

    SELECT * FROM `table` WHERE `field` = UNHEX('md5 hash')

来自PHP使用此功能(十六进制到二进制)

    function convert($hexString)
    {
            $hexLenght = strlen($hexString);
            // only hex numbers is allowed
            if ($hexLenght % 2 != 0 || preg_match("/[^\da-fA-F]/",$hexString)) return FALSE;

            unset($binString);
            for ($x = 1; $x <= $hexLenght/2; $x++)
            {
                    $binString .= chr(hexdec(substr($hexString,2 * $x - 2,2)));
            }

            return $binString;
    } 

您还可以使用: http://php.net/manual/en/function.hex2bin.php

http://php.net/manual/en/function.bin2hex.php

答案 1 :(得分:0)

second parameter设为true:

string md5 ( string $str [, bool $raw_output = false ] )