php: быстрое преобразование varchar (32), содержащего 0..9a..f, в varchar ([log [38] 16] +1) ... 0..9A..z - PullRequest
0 голосов
/ 29 ноября 2011

Предположим, у нас есть строка md5 ('somestring'). Он будет содержать символы 0..f. Итак, char (32) в порядке, чтобы сохранить этот хеш, но я полагаю, что это может занять не более 21 байта ([log 38 / log 236 + 1]) * Длина (хэш). Любая быстрая функция для преобразования строки с символами 0..f в строку с символами 0..9A..z? (который займет больше 21 байта, потому что он использует только цифры и латинские буквы)?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Лучше: хэшируйте результат в двоичном виде.Двоичные файлы работают быстрее и намного быстрее с индексами.

С помощью 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

0 голосов
/ 29 ноября 2011

Установите для второго параметра значение true:

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