Задать вопрос
@YourQuestion

Могут ли повторяться последние 3 символа md5?

Добрый день.
$sol = 'MMMddFF';
echo md5(time().$sol);


Вопрос - могут ли повторяться последние 3 символа из хеша и если да, то как выяснить через какое время будет следующее совпадение текущих 3 символов?
  • Вопрос задан
  • 447 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
alsopub
@alsopub
$start = time();
$count = 100000;
$sol = 'MMMddFF';


$last = $start;
$s = substr(md5($start.$sol), 32-3);
echo('Last: '.$s.' at '.$start);
for ($i=$start+1; $i<$start+$count; $i++) {
  $cs = substr(md5($i.$sol), 32-3);
	if ($s == $cs) {
		echo(', '.$i.' ('.($i-$last).')');
		$last = $i;
	}
}

Вывод (при каждом запуске будет разный):
Last: 28e at 1465555315, 1465556570 (1255), 1465560504 (3934), 1465564842 (4338), 1465566966 (2124), 1465573478 (6512), 1465578452 (4974), 1465583075 (4623), 1465584411 (1336), 1465584970 (559), 1465584979 (9), 1465587163 (2184), 1465588138 (975), 1465588785 (647), 1465590518 (1733), 1465591232 (714), 1465593084 (1852), 1465594658 (1574), 1465595547 (889), 1465598000 (2453), 1465598371 (371), 1465604641 (6270), 1465604940 (299), 1465606505 (1565), 1465614302 (7797), 1465614573 (271), 1465615261 (688), 1465617863 (2602), 1465621976 (4113), 1465625562 (3586), 1465634715 (9153), 1465637881 (3166), 1465638949 (1068), 1465644427 (5478), 1465646584 (2157), 1465652096 (5512), 1465653125 (1029)


Частоту повторений можно прикинуть.
Число комбинаций из 3х символов md5 - 16^3 = 4096, что есть в среднем каждые 4096 единиц будет повторение.
Повторю - в среднем, без гарантии.

Каждый символ md5 - это 0...9 + a...f итого 16 вариантов.
Комбинаций из трех таких символов - 16 в степени 3 - это азы комбинаторики.
То есть у нас всего 4096 возможных концовок md5.
md5() в среднем дает статистически непредсказуемое (читайте - случайное) значение.
Значит шанс получить заданную последовательно - 1/4096, что дает повторение через (в среднем) 4096.

PS. В данном случае совершенно не имеет значения откуда брать эти 3 символп - с конца, с начала, с середины, даже с произвольного места каждый раз и даже если эти три символа брать из разных случайных позиций - результат один - 4096 вариантов, псевдослучайное распределение, повторение в среднем через 4096.
Ответ написан
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Какая разница, md5 это или что-то ещё? Вы берёте всего 3 символа. Это всего 16 ([a-f0-9]) различных значений каждого символа.
16^3 = 4096.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы