2010-07-24 35 views
0

我需要在unix平臺上檢查特定腳本的輸出1000次,並檢查它是否有任何改變。unix環境中最快的哈希?

我一直在做這樣的:

(script_stuff) | md5sum 

和存儲這個值。我其實並不需要「md5」,只是一個簡單的散列函數,我可以將它與存儲值進行比較,看看它是否發生了變化。沒關係,如果有偶然的誤報。

有什麼比md5sum更好的工作,生成一個相當可用的散列值?腳本本身會生成幾行文本 - 平均可達10-20個,最多可達100個左右。

我看了看fast md5sum on millions of strings in bash/ubuntu - 這很棒,但我無法編譯一個新程序。需要一個系統工具... :(


附加「背景」的細節:

我被要求監視一組的1000個左右域的DNS記錄,並立即撥打某些其他腳本如果有任何改變,我打算做一個挖掘xyz + short語句並散列它的輸出並存儲它,然後根據以前存儲的值進行檢查,任何更改都會觸發另一個腳本,否則它會繼續。現在,我們正在計劃使用cron來處理這1000個集合,但是可以完全不同地認爲「嚴重」的使用 - 約20000個左右。我不知道這樣一個系統的用途是什麼,我只是把它當做別人的工作...

+3

在典型的桌面系統上,md5sum每秒可以處理數百兆字節的數據(請查看'pv/dev/zero | md5sum')。無論使用什麼哈希算法,I/O和進程產卵開銷都可能會佔上風。 – rkhayrov 2010-07-24 12:08:45

+1

你爲什麼要把它寫成shell腳本:| - python和其他腳本語言在它們的std庫中有散列函數。每個散列的進程開始會產生很多開銷。 – sleeplessnerd 2012-05-12 23:10:00

回答

4

cksum實用程序計算非加密的CRC校驗和。

+0

哇 - 這是我點擊caf - 這削減了200秒的測試集8秒(唯一的變化是用cksum替換md5sum)!大!我甚至沒有意識到這樣的工具! – RubiCon10 2010-07-25 09:42:12

3

你檢查的輸出有多大?最多一百行我只是保存整個原始文件,然後使用cmp來查看它是否發生了變化。假設散列計算必須讀取每個字節,那麼從校驗和類型計算中獲得優勢的唯一方法是,如果執行此操作的成本低於讀取兩個具有該大小的文件的成本。

而且cmp根據您的問題的更新不會給你任何假陽性或假陰性:-)

pax> echo hello >qq1.txt 
pax> echo goodbye >qq2.txt 
pax> cp qq1.txt qq3.txt 
pax> cmp qq1.txt qq2.txt >/dev/null 
pax> echo $? 
1 
pax> cmp qq1.txt qq3.txt >/dev/null 
pax> echo $? 
0 

我被要求監視DNS記錄一組1000個左右的域名,並且如果有任何變化,立即調用某些其他腳本。我打算做一個挖掘xyz + short語句並散列它的輸出並存儲它,然後根據以前存儲的值進行檢查。任何改變都會觸發另一個腳本,否則就會繼續。現在,我們正在計劃使用cron來處理這1000個數據集,但是可以完全不同地認爲「嚴重」的使用 - 大約20000左右。

我不確定你需要擔心太多的文件I/O。以下腳本首先用文件I/O執行了5000次5000次,然後輸出到/dev/null(通過更改註釋)。

#!/bin/bash 
rm -rf qqtemp 
mkdir qqtemp 
((i = 0)) 
while [[ $i -ne 5000 ]] ; do 
     #dig microsoft.com +short >qqtemp/microsoft.com.$i 
     dig microsoft.com +short >/dev/null 
     ((i = i + 1)) 
done 

在5次運行所經過的時間分別是:

File I/O | /dev/null 
----------+----------- 
    3:09 | 1:52 
    2:54 | 2:33 
    2:43 | 3:04 
    2:49 | 2:38 
    2:33 | 3:08 

去除異常值和平均後,結果是2:49用於文件I/O和2:45的/dev/null。對於5000次迭代,時間差爲4秒,每個項僅有012秒的時間差。

但是,由於對5000進行迭代最多需要三分鐘,這就是檢測問題需要多長時間(平均一分半鐘)。如果這是不可接受的,你需要從bash移到另一個工具。

假設一個只需要大約0.012秒,理論上你應該在60秒內完成5000次,假設你的檢查工具完全沒有時間。在Perl中做這樣的事情可能會更好,並使用關聯數組來存儲的輸出。

Perl的半編譯特性意味着它的運行速度可能會比bash腳本快得多,而Perl的花哨的東西將使工作變得更加簡單。但是,由於運行命令需要多長時間,因此您不可能將60秒的時間降低得多。

+0

謝謝帕克斯 - 但我想磁盤調用的巨大數量會進一步減慢程序。你同意嗎? – RubiCon10 2010-07-24 12:22:23

+0

你談論的數字究竟是多少?你的問題提到了一百行文字。除非它們很長,否則你根本就沒有談論太多的I/O。 – paxdiablo 2010-07-24 14:29:54

+0

此腳本將在一組5000個數據集(將獨立更改)的情況下每2-3分鐘左右運行一次。如果輸出結果不是「記錄」/在那段時間進行比較,我錯過了必要的警報生成 – RubiCon10 2010-07-25 05:13:45