"PHP" / Говнокод #25946 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
<?php

define('MAX_NUMBER', 70);

function factorial($value) {
    return array_reduce(range(1, $value), function($carry,$item){return $carry*$item;}, 1);
}

function R($value) {
    return floor(2*sqrt(log(($value))));
}

function make_chain($start, $length) {
    $chain['start'] = $start;
    for($i = 0; $i < $length; ++$i) {
        $hash = factorial($start);
        echo ">>> $start! == $hash\n";            // диагностическое сообщение
        $start = R($hash);
        if($start == 0) break;
    }
    $chain['end'] = $hash;
    echo "Chain from ${chain['start']} to ${chain['end']} is ready.\n"; // диагностическое сообщение
    return $chain;
}

function make_chains($count, $length) {
    $chains = [];
    mt_srand();
    for($i = 0; $i < $count; ++$i) {
        $number = mt_rand(0, MAX_NUMBER - 1);                // начинаем цепочку с псевдослучайного слова
        $chain = make_chain($number, $length);
        $hash = $chain['end'];                               // используем конец найденной цепочки как индекс для быстрого поиска
        if(!isset($chains[$hash])) $chains[$hash] = [];      // если такого хэша не было в корзине, инициализируем её
        if(!in_array($chain['start'], $chains[$hash])) {     // проверяем на дубли
            $chains[$hash][] = $chain['start'];              // добавляем начало цепочки в корзину
        }
    }
    return $chains;
}

function find_hash_in_basket($needle, $haystack_start, $haystack_end) {
    echo "Роемся в цепочке от $haystack_start до $haystack_end.\n";       // диагностическое сообщение
    $current_number = $haystack_start;
    do {
        $current_hash = factorial($current_number);         // <-- сюда вставьте нужную хэш-функцию
        if($current_hash <= $needle && $needle <= $current_hash * ($current_number + 1)) {
             return $current_number;                  // нашли
        }
        $current_number = R($current_hash);  // роем в глубину
    } while($current_hash !== $haystack_end);
    return false; // не нашли
}

function search_hash($hash, $chains, $length) {
    $current_hash = $hash;
    for($i = 0; $i < $length; ++$i) {
          if(isset($chains[$current_hash])) {                // нашли хэш в одной из корзин
              echo "Лезем в корзину $current_hash.\n";       // диагностическое сообщение
              foreach($chains[$current_hash] as $start) {    // роемся в корзине
                  $result = find_hash_in_basket($hash, $start, $current_hash); // пытаемся найти в каждой из цепочек корзины
                  if($result) {
                      return $result;                        // конец поиска
                  }
              }
          }
          $next_number = R($current_hash);             // копаем в глубину
          $current_hash = factorial($next_number);
    }
    return false; // не нашли
}

///////////////////// ПРИМЕР //////////////////////////////////


$chains = make_chains(10, 5);
echo "Радужные таблицы готовы.\n";
var_dump($chains);

$hash = 721;
echo "Пытаемся обратить $hash.\n";
$number = search_hash($hash, $chains, 5);
echo $number . "! <= $hash <= " . ($number+1) . "!\n";

Безумная идея: использовать радужные таблицы для обращения математических функций. Например, радужная таблица для факториала:
http://ideone.com/Q22EXy

Запостил: ropuJIJIa ropuJIJIa, (Updated )

Комментарии (11) RSS

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8