[[20181012085134]] 『ハッシュ値の取得』(助六) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ハッシュ値の取得』(助六)

VBAでのコード組みを行おうとしています。
まだ目論見段階なのですが、ご相談させていただきたく投稿しました。

外注先から動画データが納品されるのですが、併せてそのハッシュ値(MD5)も
同梱されてきます。
納品データコピー後ハッシュ値を取得して比較するのですが、MD5の取得に1ファイルあたり平均2時間程度かかっています。
MD5の取得にはVBAからコマンドをたたいて、標準出力を取得するようにしています。
CertUtil -hashfile <ファイル名> MD5

最近xxHashが高速で信頼性もあると知り、是非使用してみたいと思うのですが、
どうすればVBAから使用できるかよくわかりませんでした。

ご存知の方がいらっしゃいましたらご教示いただけないでしょうか。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


全然関係なかったらごめんなさい。

ハッシュ値の取得ってファイルの全データを読み込まなければならない(?)ので、ハッシュを算出するファイルをCDに入れたままとか、ネットワークドライブ上に置いて計算すると極端に時間がかかる場合がありました。

元の容量は知りませんが、2時間はかかりすぎのような気もしますが・・・

確認ですが、ローカルストレージ上で実施されてますか?
ハードウェアのどこかがボトルネックになっていませんか?
・ディスク読取り速度  ローカルストレージのSSDで実施するのが最良
・メモリの空き容量   足りてない場合は増設。
・CPU使用率       どうしようもなさそう。

もちろんソフトウェアの見直しで高速化される可能性は十分にあります。
(名無し) 2018/10/12(金) 10:04


動画であれば暗号化は伴わないので、確かにxxHashの得意なデータでしょう。 速度効果は高そうです。

しかし、Web検索してみましたが、ExcelからxxHashを使った人が全く見つかりませんでした。 ご存知な方は誰も居ない、となると、助六さんが先駆者として試行錯誤してみるしかないですね。(既にツールでハッシュ値を得ているのだから、検算せずに答えが合っているか確認できる分、ここの回答者より有利ですし)

元々、VBAには Unsigned な整数型は無いし、シフト演算命令は無いし、簡単な足し算だけでも検算が面倒になるのです。 C#あたりで作成すべきものであり、VBAで使えるかどうか調べるには、それなりの覚悟が必要でしょう。

方針としては、いずれかの環境に適したもの(C#32かJAVA32かJavaScript用か、ExcelのBit数に合ったもの)をインストールしてみて、駄目なようなら消して別のをインストールして、ひたすら試行錯誤していきます。 VBA側では CreateObject("xxHash") (オブジェクト名は調べてください)できるかどうか試し、宣言できたならばHashメソッドにファイルを読み込んだストリームを渡し、結果を確認します。 動作して値が得られてもツール利用のものと一致しないようならば、コード変換が必要になるかも知れません。

結果確認には、いきなり大きなデータを使わずとも、小さなデータで比較してみれば良いでしょう。 結果が一致するようならば、大きなデータでの確認ですね。 気になるのは、動画データは大きいので、32bit版では対応できなかったりしないかという点。(ファイルサイズが2GB以上または4GB以上で結果が変わる可能性) 小さいデータはOKでも大きいと駄目、という場合、OSとExcelを64bit版にインストールし直す事になるかも知れません。
(???) 2018/10/12(金) 10:09


環境面での見直しならば、元データはローカルドライブにコピーする事と、ウィルスチェックは止めておく事でしょうか。 計算時にはファイル読み込み性能が重要なので、SSDにコピーすると効果があるでしょう。 USBメモリでは、インターフェース速度が遅いので駄目です。
(???) 2018/10/12(金) 10:12

皆様ご回答いただきありがとうございます。

いくつかご質問いただいたのでそれについて回答させていただきます。
まず元データ容量ですが、1ファイルあたり1GB〜5GB程となります。
データの格納先は残念ながらローカル上ではなく、ネットワーク上のサーバまたはUSB接続のHDDドライブとなります。
OSについてはWin7(64bit)、
ExcelはOffice2010(32bit)です。

確かにローカル上にデータを置いてハッシュ値を取得すると2時間もかかるようなことはありませんが、
運用ルール上できません。

皆さんのおっしゃる通り、ハッシュ値の計算自体よりもデータの読み取り速度の方がネックになっているかもしれませんね。

ただ一度試してはみたいと思います。私の知識量はつたないものですので、皆様のお力をお借りしたいと思います。

(助六) 2018/10/12(金) 10:51


ネットワーク上のファイルを対象にすると、処理している間は頻繁にデータ転送が行われるため、ネットワーク負荷がずっと上がってしまうのですけどね。 全員の生産性を落とすルールってどうなの?、と思ってしまいます。 USBなら他者に影響はないですが、USB2なら遅すぎますね。USB3なら少しまともな速度が出ますが。

明確にローカルに置いては駄目ならば、VBA内でファイルをテンポラリにコピーし、これを対象にツール使用し、計算が終わったならばテンポラリファイルは削除する、という処理はアリなのでしょうか?
(???) 2018/10/12(金) 11:09


手持ちの11GBのファイルを使ってMD5を検証してみました。
CPUはCorei7Ex 3.5GHzですが、単一スレッドしか働かないので普通のCPUと大差ないと思います。
検証中はディスクの負荷はそれほど無く、CPUの1スレだけがずっと100%でした。

2000MB/sのM.2SSDで
C#のSystem.Security.Cryptographyで算出したところ28秒でした
コマンドプロンプト上のCertUtilで算出したところ25秒でした。。

170MB/sのUSB3.0 HDDで
C#のSystem.Security.Cryptographyで算出したところ32秒でした。
コマンドプロンプト上のCertUtilで算出したところ26秒でした。

USBのHDDであれば(USB3.0なら)ローカルHDDと同等の速度が出ますので、読取りはボトルネックにはならなさそうです。

むしろ何をしたら5GBのファイルに2時間もかかるのか不思議でなりません。
ネットワークが100BASE-Tだとしてもそこまでかからないと思います。(たぶん)

※計測してから思ったんですが、ダミーファイル作って試せばよかったですね。
(カレントディレクトリに1GBのファイルを生成してMD5を求める検証用バッチコード)
echo %time%
fsutil file createnew "test" 1073741824
echo %time%
CertUtil -hashfile "test" MD5
echo %time%

(名無し) 2018/10/12(金) 11:36


皆様ご回答いただきありがとうございます。

大変大きな間違いをひとつしておりました。
1ファイルあたり平均2時間⇒納品されたHDD1本あたり平均2時間
でした。
納品されたHDDには50〜120ほどファイルがあるため、1ファイルあたりは数分でした。
大変申し訳ありませんでした。

USB接続の場合は3.0のみです。
LAN接続の場合は1000BASEです。

???様
ネットワークの負荷についてはVLANで独立したものを使用しますので
あまり問題視しておりませんでした。
コピーのNG検証ですので、テンポラリへのコピーしてのハッシュ値取得は元データと違う可能性を捨てきれないのでNGとなります。

皆様からのご提案とご警告大変参考になります。
(助六) 2018/10/12(金) 12:06


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.