Мне нужна функция PHP, которая создаст 8 символов, длинных [a-z] хеш от любой входной строки. Так, например, когда я отправлю "Переполнение стека", оно возвратится, например, "gdqreaxc" (8 символов [a-z] никакие позволенные числа)
Возможно что-то вроде:
$hash = substr(strtolower(preg_replace('/[0-9_\/]+/','',base64_encode(sha1($input)))),0,8);
Это создает хэш SHA1, кодирует его по основанию 64 (давая нам полный алфавит), удаляет символы, отличные от альфа, уменьшает их и обрезает.
Для $ input = 'yar!';
:
mwinzewn
Для $ input = 'yar !!';
:
yzzhzwjj
Так что распространение кажется довольно хорошим.
Эта функция сгенерирует хэш, содержащий равномерно распределенные символы [az]
:
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%, если мои математические расчеты верны.
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...) плюс модуло и т.д...
как насчет
substr (preg_replace(md5($mystring), "/[1-9]/", ""), 0, 8 );
, вы можете добавить немного больше энторпии, выполнив
preg_replace($myString, "1", "g");
preg_replace($myString, "2", "h");
preg_replace($myString, "3", "i");
и т. Д. Вместо того, чтобы убирать цифры.
один может дать вам хороший a-p{8} (но не a-z), используя и изменяя (вывод) хорошо известного алгоритма:
function mini_hash( $string )
{
$h = hash( 'crc32' , $string );
for($i=0;$i<8;$i++) {
$h{$i} = chr(96+hexdec($h{$i}));
}
return $h;
}
интересный набор ограничений, который вы там разместили