Perlで32MBファイルのエントロピーを計算する-最も速い方法は何ですか?

BwE

エントロピーが必要な32,678kbの暗号化されたbinファイルがあります。私はより大きなプロジェクトの一部としてPerlを使用しています。

私はこれまでに次の「テクニック」を使用しました。

use Shannon::Entropy qw/entropy/;
my $file = "test.bin";
open(my $bin, "<", $file) or die $!; binmode $bin;
seek($bin, 0x000000, 0); 
read($bin, my $entropy, 0x01FFFFF0);
print entropy($entropy);

これにより、30分以上経過するとあきらめるまで、ほぼ無限の待機時間が発生します。

ファイル全体のエントロピーをテストすることから逸脱することはできません。

もっと速い方法はありますか?それを分割し、エントロピーし、奇妙な数学を使用して再び組み合わせると、1つのファイルであるかのように同じエントロピーになりますか?

JGNI

これは、すべてのマップ呼び出しを回避するために書き直されたエントロピー関数です。

sub entropy {
    my ($entropy, $len, $p, %t) = (0, length($_[0]));
    my @chars = split '', $_[0];
    $t{$_}++ foreach @chars;

    foreach (values %t) {
        $p = $_/$len;
        $entropy -= $p * log $p ;
    }       

    return $entropy / log 2;
}

それはあなたのためにより速くうまくいくかもしれません

私はこれについて考え直しました。実際にファイルをメモリに丸呑みする必要はありません。$len取得することができるファイルの長さ-s $file_name%t時間のブロックに読み取ることによって計算することができる周波数テーブルです。したがって、ファイルのエントロピーを計算する関数のバージョンは次のようになります。

sub file_entropy {
    my ($file_name) = @_;

    # Get number of bytes in file
    my $len = -s $file_name;
    my ($entropy, %t) = 0;

    open (my $file, '<', $file_name) || die "Cant open $file_name\n";
    binmode $file;

    # Read in file 1024 bytes at a time to create frequancy table
    while( read( $file, my $buffer, 1024) ) {
        $t{$_}++ 
            foreach split '', $buffer;

        $buffer = '';
    }

    foreach (values %t) {
        my $p = $_/$len;
        $entropy -= $p * log $p ;
    }       

    return $entropy / log 2;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

行列乗算の最も速い方法は何ですか?

分類Dev

フロートの逆を取得する最も速い方法は何ですか

分類Dev

Common Lispで階乗を計算する最も速い方法は何ですか?

分類Dev

ファイルのMD5をロードする最も速い方法は何ですか?

分類Dev

C ++でベクトルを比較する最も速い方法は何ですか?

分類Dev

JavaScriptで配列をループする最も速い方法は何ですか?

分類Dev

Javaで文字列を比較する最も速い方法は何ですか?

分類Dev

条件で変数を更新する最も速い方法は何ですか?

分類Dev

条件で変数を更新する最も速い方法は何ですか?

分類Dev

PHPで配列に値を追加する最も速い方法は何ですか

分類Dev

Javaで非常に大きなファイルをスキャンする最も速い方法は何ですか?

分類Dev

double [] []をJavaのMATLAB行列に取得する最も速い方法は何ですか?

分類Dev

JavaでSystem.inから読み取る最も速い方法は何ですか?

分類Dev

大きなファイルから特定の行を削除する最も速い方法は何ですか?

分類Dev

MATLABでこの合計を計算する最も速い方法は何ですか?

分類Dev

python-辞書からファイルの行を置き換える最も速い方法は何ですか?

分類Dev

PythonでHTTP GETを行う最も速い方法は何ですか?

分類Dev

Pythonでファイルを再帰的に検索する最も速い方法は何ですか?

分類Dev

ある範囲でフロート角度を制限する最も速い方法は何ですか?

分類Dev

2つのuint8_t変数間の差を計算する最も速い方法は何ですか?

分類Dev

このコードを短くする最良の(または最も速い)方法は何ですか?

分類Dev

Pythonで離散ピクセル値から画像を描画する最も速い方法は何ですか?

分類Dev

多数の小さなファイルをメモリに読み込む最も速い方法は何ですか?

分類Dev

それの最終的なURLへのリンクを302にする最も速い方法は何ですか?

分類Dev

Pythonで100,000のHTTPリクエストを送信する最も速い方法は何ですか?

分類Dev

インタビューの質問:素数を再帰的に生成する最も速い方法は何ですか?

分類Dev

Cで-PIと+ PIの間の数値をトリミングする最も速い方法は何ですか?

分類Dev

URLからドメイン/ホスト名を取得する最も速い方法は何ですか?

分類Dev

リスト内の数字の増加する桁をソート/フィルタリング/合計する最も速い方法は何ですか

Related 関連記事

  1. 1

    行列乗算の最も速い方法は何ですか?

  2. 2

    フロートの逆を取得する最も速い方法は何ですか

  3. 3

    Common Lispで階乗を計算する最も速い方法は何ですか?

  4. 4

    ファイルのMD5をロードする最も速い方法は何ですか?

  5. 5

    C ++でベクトルを比較する最も速い方法は何ですか?

  6. 6

    JavaScriptで配列をループする最も速い方法は何ですか?

  7. 7

    Javaで文字列を比較する最も速い方法は何ですか?

  8. 8

    条件で変数を更新する最も速い方法は何ですか?

  9. 9

    条件で変数を更新する最も速い方法は何ですか?

  10. 10

    PHPで配列に値を追加する最も速い方法は何ですか

  11. 11

    Javaで非常に大きなファイルをスキャンする最も速い方法は何ですか?

  12. 12

    double [] []をJavaのMATLAB行列に取得する最も速い方法は何ですか?

  13. 13

    JavaでSystem.inから読み取る最も速い方法は何ですか?

  14. 14

    大きなファイルから特定の行を削除する最も速い方法は何ですか?

  15. 15

    MATLABでこの合計を計算する最も速い方法は何ですか?

  16. 16

    python-辞書からファイルの行を置き換える最も速い方法は何ですか?

  17. 17

    PythonでHTTP GETを行う最も速い方法は何ですか?

  18. 18

    Pythonでファイルを再帰的に検索する最も速い方法は何ですか?

  19. 19

    ある範囲でフロート角度を制限する最も速い方法は何ですか?

  20. 20

    2つのuint8_t変数間の差を計算する最も速い方法は何ですか?

  21. 21

    このコードを短くする最良の(または最も速い)方法は何ですか?

  22. 22

    Pythonで離散ピクセル値から画像を描画する最も速い方法は何ですか?

  23. 23

    多数の小さなファイルをメモリに読み込む最も速い方法は何ですか?

  24. 24

    それの最終的なURLへのリンクを302にする最も速い方法は何ですか?

  25. 25

    Pythonで100,000のHTTPリクエストを送信する最も速い方法は何ですか?

  26. 26

    インタビューの質問:素数を再帰的に生成する最も速い方法は何ですか?

  27. 27

    Cで-PIと+ PIの間の数値をトリミングする最も速い方法は何ですか?

  28. 28

    URLからドメイン/ホスト名を取得する最も速い方法は何ですか?

  29. 29

    リスト内の数字の増加する桁をソート/フィルタリング/合計する最も速い方法は何ですか

ホットタグ

アーカイブ