PHP функция для создания хеша длиной 8 символов - PullRequest
7 голосов
/ 07 июля 2010

Мне нужна функция PHP, которая создаст 8-значный хеш [a-z] из любой входной строки. Так, например когда я отправлю «Переполнение стека», он вернется, например. "gdqreaxc" (8 символов [a-z] номера не допускаются)

Ответы [ 5 ]

11 голосов
/ 07 июля 2010

Возможно что-то вроде:

$hash = substr(strtolower(preg_replace('/[0-9_\/]+/','',base64_encode(sha1($input)))),0,8);

Это создает хеш SHA1, base-64 кодирует его (дает нам полный алфавит), удаляет не-альфа-символы, ставит его в нижнем регистре и усекает.

Для $input = 'yar!';:

mwinzewn

Для $input = 'yar!!';:

yzzhzwjj

Таким образом, спред выглядит довольно хорошо.

3 голосов
/ 07 июля 2010

Эта функция генерирует хеш, содержащий равномерно распределенные символы [a-z]:

function my_hash($string, $length = 8) {

    // Convert to a string which may contain only characters [0-9a-p]
    $hash = base_convert(md5($string), 16, 26);

    // Get part of the string
    $hash = substr($hash, -$length);

    // In rare cases it will be too short, add zeroes
    $hash = str_pad($hash, $length, '0', STR_PAD_LEFT);

    // Convert character set from [0-9a-p] to [a-z]
    $hash = strtr($hash, '0123456789', 'qrstuvwxyz');

    return $hash;
}

Кстати, если это важно для вас, для 100 000 различных строк у вас будет ~ 2% шансстолкновение хешей (для хеша длиной 8 символов), и для миллиона строк этот шанс возрастает до ~ 90%, если моя математика верна.

0 голосов
/ 07 июля 2010

Вы можете получить хороший ап {8} (но не аз), используя и модифицируя (вывод) хорошо известного алгоритма:

function mini_hash( $string )
{
  $h = hash( 'crc32' , $string );
  for($i=0;$i<8;$i++) {
    $h{$i} = chr(96+hexdec($h{$i}));
  }
  return $h;
}

интересный набор ограничений, которые вы разместили там

0 голосов
/ 07 июля 2010
function md5toabc($myMD5)
{
   $newString = "";
   for ($i = 0; $i < 16; $i+=2)
   {
        //add the first val of 0-15 to the second val of 0-15 for a range of 0-30

        $myintval = hexdec(substr($myMD5, $i, $i +1) )  + 
                    hexdec(substr($myMD5, $i+1, $i +2) );
        // mod by 26 and add 97 to get to the lowercase ascii range        
        $newString .= chr(($myintval%26) + 97);
   }
   return $newString;
}

Обратите внимание, что это вводит в заблуждение различных персонажей, но делайте с этим что хотите. (Как и при броске двух кубиков, наиболее распространенное значение - это 7 вместе ...) плюс модуль и т. Д. *

0 голосов
/ 07 июля 2010

как насчет

substr (preg_replace(md5($mystring), "/[1-9]/", ""), 0, 8 );

Вы можете добавить немного энтропии, выполнив

preg_replace($myString, "1", "g");
preg_replace($myString, "2", "h");
preg_replace($myString, "3", "i");

и т. Д. Вместо удаления цифр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...