Какой метод лучше? Хеширование каждой строки в файле с помощью PHP - PullRequest
0 голосов
/ 20 сентября 2011

Этот вопрос был задан на доске объявлений, и я хочу получить окончательный ответ и разумные дебаты о том, какой метод является более семантически правильным и менее ресурсоемким.

Скажите, у меня есть файл с каждой строкой вэтот файл, содержащий строку.Я хочу сгенерировать хеш MD5 для каждой строки и записать его в тот же файл, перезаписывая предыдущие данные.Моей первой мыслью было сделать это:

$file = 'strings.txt';

$lines = file($file);
$handle = fopen($file, 'w+');

foreach ($lines as $line)
{
    fwrite($handle, md5(trim($line))."\n");
}

fclose($handle);

Другой пользователь отметил, что file_get_contents () и file_put_contents () лучше, чем использование fwrite () в цикле.Их решение:

$thefile = 'strings.txt';
$newfile = 'newstrings.txt';

$current = file_get_contents($thefile);

$explodedcurrent = explode('\n', $thefile);

$temp = '';
foreach ($explodedcurrent as $string)
      $temp .= md5(trim($string)) . '\n';

$newfile = file_put_contents($newfile, $temp);

Мой аргумент состоит в том, что, поскольку основная цель этого состоит в том, чтобы получить файл в массив , а file_get_contents () является предпочтительным способом чтения содержимогофайл в строку , file () является более подходящим и позволяет нам вырезать другую ненужную функцию, explode ().

Кроме того, непосредственно манипулируя файлом с помощью fopen (),fwrite () и fclose () (что точно так же, как один вызов file_put_contents ()), нет необходимости иметь посторонние переменные для хранения преобразованных строк;вы записываете их непосредственно в файл.

Мой метод точно такой же, как и альтернативный - такое же количество открытий / закрытий в файле - за исключением того, что мой метод короче и более семантически правильный.

Что вы хотите сказать, и какой бы вы выбрали?


Это должно быть более эффективным и менее ресурсоемким, как два предыдущих метода:

$file = 'passwords.txt';

$passwords = file($file);
$converted = fopen($file, 'w+');

while (count($passwords) > 0)
{
    static $i = 0;
    fwrite($converted, md5(trim($passwords[$i])));
    unset($passwords[$i]);
    $i++;
}

fclose($converted);

echo 'Done.';

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

Я бы предложил написать новый временный файл , пока вы обрабатываете входной файл.После этого перезапишите входной файл временным.

0 голосов
/ 20 сентября 2011

Как один из комментариев предлагает сделать то, что имеет больше смысла для вас. Поскольку вы можете вернуться к этому коду через несколько месяцев и вам нужно потратить наименьшее количество времени, пытаясь его понять.

Однако, если вас беспокоит скорость, я бы создал два тестовых примера (вы их уже почти получили) и использовал timestamp (создайте переменную с timestamp в начале скрипта, а затем в конце сценарий вычтите его из timestamp в конце сценария, чтобы выяснить разницу - сколько времени потребовалось для запуска сценария.) Подготовьте несколько файлов, которые я бы использовал приблизительно для 3, двух крайностей и одного нормального файла. Чтобы увидеть, какая версия работает быстрее.

http://php.net/manual/en/function.time.php

Я думаю, что различия будут незначительными, но это также зависит от размера ваших файлов.

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