Bash 散列文本文件每行的最有效方法?

Bash 散列文本文件每行的最有效方法?,bash,hash,echo,processing-efficiency,Bash,Hash,Echo,Processing Efficiency,我目前正在编写一个Bash脚本,它对文本文件的每一行进行散列,并将其输出到一个新文件中,格式为hash:orginalword。我现在要做的脚本是: cat $originalfile | while read -r line; do hash="$(printf %s "$line" | $hashfunction | cut -f1 -d' ')" echo "$hash:$line" >> $outputlocation done 我最初从一个非常类似的问题中

我目前正在编写一个Bash脚本,它对文本文件的每一行进行散列,并将其输出到一个新文件中,格式为
hash:orginalword
。我现在要做的脚本是:

cat $originalfile | while read -r line; do
    hash="$(printf %s "$line" | $hashfunction | cut -f1 -d' ')"
    echo "$hash:$line" >> $outputlocation
done

我最初从一个非常类似的问题中得到了这个问题的代码。剧本完全按照广告宣传的那样运作;但是,问题是,即使对于非常小的文本文件(),您也可以将文件拆分为每行一个文件,并在一次调用中完成:

$ cat > words.txt << EOF
> foo
> bar
> baz
> EOF
$ split --lines=1 words.txt 
$ sha256sum x*
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  xaa
7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730  xab
bf07a7fbb825fc0aae7bf4a1177b2b31fcf8a3feeaf7092761e18c859ee52a9c  xac
$cat>words.txt foo
>酒吧
>巴兹
>EOF
$split--lines=1 words.txt
$sha256sum x*
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c xaa
7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730 xab
BF07A7FBB825FC0AAE7BF4A1177B2B31FC8A3FEEAFF7092761E18C859EE52A9C xac

在纯shell中执行此操作时,我会非常小心。为每行启动哈希函数的开销会使它在大文件中的速度非常慢

来点Perl怎么样

perl -MDigest::MD5 -nle 'print Digest::MD5::md5_hex($_), ":", $_' <$originalfile >>$outputlocation
如果您想使用Whirlpool,您可以使用从CPAN安装它

cpan install Digest::Whirlpool
和它一起使用

perl -MDigest -nle '$ctx = Digest->new("Whirlpool"); $ctx->add($_); print $ctx->hexdigest(), ":", $_' <$originalfile >>$outputlocation
perl-MDigest-nle'$ctx=Digest->new(“Whirlpool”);$ctx->add($);print$ctx->hexdigest(),“:”,$”>$outputlocation

您必须在
bash
中执行此操作吗?您应该使用一种内置
md5()
函数的语言,而不必为每行运行一个程序。@Barmar当然可以使用另一种语言;只是bash实际上是我唯一精通的语言。另一个稍微复杂的问题是脚本的“$hashfunction"是一个变量,可以分配给任何哈希函数命令,如SHA1、MD5、whirlpool等。目前可以找到,但正如我所说,它需要很长的时间来处理,这就是为什么我希望优化当前脚本的效率。如果不是Bash,您会推荐哪种语言?PHP或Python将很容易。当y是一个问题,
bash
很少是正确的解决方案。我想不出任何方法来优化脚本。你遇到的问题是,你必须为每一行启动一个新的哈希程序调用。在
bash
中没有办法解决这个问题。谢谢你的回答!我马上就去做,听起来像是far效率更高。只是尝试了一下,似乎无法让它工作。感谢您的回答,我稍后会尝试一下。您如何使用该解决方案实现MD5以外的其他哈希函数?Perl有大量不同的
摘要
模块。例如,有一个
摘要::SHA
模块,它不支持sha256_hex等。文档在上可用。刚刚尝试过这种方法,它非常有效。我想唯一的缺点是您无法使用OSX附带的许多内置openssl哈希算法,但我认为这是您为提高效率而做出的妥协。非常感谢!很抱歉打扰您;您的方法工作得绝对完美不过,我也想使用你链接的网站上列出的一些其他算法,如MD2、MD4和SHA2,但即使在使用cpan下载它们之后,它们似乎也无法正常工作。你能提供使用这些算法的格式吗?非常感谢!P.S.你知道实验室还有其他算法吗le哪些使用的方法与该网站上未列出的方法相同?没有问题:-)您最好使用裸摘要模块,只需在
新建
方法中更改哈希的名称即可。因此,对于MD2,运行
cpan install Digest::MD2
,然后使用
perl-MDigest-nle'$ctx=Digest->new(“MD2”)$ctx->add($u41;;打印$ctx->hexdigest()。SHA模块包括SHA-1、SHA-384等,因此只需在
new
中指定它们即可。
openssl
中散列的另一个模块是
Digest::MD4
。我看不到MDC2的。RIPEMD160有一个模块,
Crypt::Digest::RIPEMD160
,但它有点奇怪,不能与
Digest
一起使用。不过,CPAN文档中有一些例子。
perl -MDigest -nle '$ctx = Digest->new("Whirlpool"); $ctx->add($_); print $ctx->hexdigest(), ":", $_' <$originalfile >>$outputlocation