fork download
  1. <?php
  2.  
  3. function split_hash($hash, $sizes) {
  4. $cnt = count($sizes); // количество словарей
  5. $partSize = floor(128/4/$cnt); // размер части хэша в тетрадах
  6. $result = array();
  7. foreach($sizes as $size) {
  8. $tmp = substr($hash, 0, $partSize); // разбиваем хэш по тетрадам на равные части
  9. $hash = substr($hash, $partSize);
  10. $result[] = gmp_intval(gmp_mod(gmp_init($tmp, 16), $size)); // возвращаем остаток от деления фрагмента хэша
  11. // на размер словаря
  12. }
  13. return $result;
  14. }
  15.  
  16. function R($hash, $dicts) {
  17. $sizes = array_map(function($val){return count($val);}, $dicts); // получаем размеры каждого словаря
  18. $indices = split_hash($hash, $sizes);
  19. $result = '';
  20. foreach($indices as $dictNumber=>$index) {
  21. $result .= $dicts[$dictNumber][$index]; // сцепляем слово из частей
  22. }
  23. return $result;
  24. }
  25.  
  26. function make_chain($start, $length, $dicts) {
  27. for($i = 0; $i < $length; ++$i) {
  28. $hash = md5($start);
  29. echo $hash . ' : ' . $start . PHP_EOL;
  30. $start = R($hash, $dicts);
  31. }
  32. }
  33.  
  34. make_chain('свинособака', 10, array(
  35. array('свино', 'овце', 'тигро', 'косатко', 'зубро', 'волко', 'кото'),
  36. array('собака', 'бык', 'лев', 'дельфин', 'бизон')
  37. ));
  38.  
Success #stdin #stdout 0.03s 24424KB
stdin
Standard input is empty
stdout
360629d3cf05cee0240a23e1251c58a0 : свинособака
1f7ad860b089c0e1141de02ac1e6e3ef : волкобизон
6f2e4e3025c9dd840f1fa4a78792ef31 : котобизон
d5812761186013ecca674a2704d5a081 : зубробык
b4499d259156939bb74cbc1743632c8d : овцебизон
c28ad194fcc581f538d109f8acb6b1f5 : волкобык
663a3e06c88185db8fd4f81829e66b85 : котодельфин
30bb70e972bf073c7aa4ec93c8d5b9a0 : косаткодельфин
cc31cd8554c1add0128013bba2e47317 : волколев
d88e78b7340637370628848b1957b4c2 : котособака