哪种方法更好?用PHP对文件中的每一行进行散列


Which method is better? Hashing each line in a file with PHP

有人在留言板上问了这个问题,我想得到一个明确的答案,并就哪种方法在语义上更正确、资源消耗更少进行明智的讨论。

假设我有一个文件,该文件中的每一行都包含一个字符串。我想为每一行生成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()更合适,并且允许我们省去另一个不必要的函数,即爆炸()。

此外,通过使用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.';

正如其中一条评论所建议的那样,做对你更有意义的事情。因为您可能会在几个月后再次使用这段代码,并且您需要花费最少的时间来理解它。

然而,如果速度是你关心的,那么我会创建两个测试用例(你几乎已经得到了它们),并使用timestamp(在脚本开始时使用timestamp创建变量,然后在脚本结束时从脚本结束时的timestamp中减去它来计算差异-运行脚本需要多长时间。)准备几个文件,我会准备大约3个,两个极端和一个正常文件。查看哪个版本运行得更快。

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

我认为差异是微不足道的,但这也取决于文件大小。

我建议在您处理输入文件时编写一个新的临时文件。完成后,用临时文件覆盖输入文件。