2016-02-19 58 views
0

我正在做一個解碼編碼密碼的腳本,以便我可以看到原始密碼。問題是順序碼比多線程碼快。順序碼持續12秒,多線程持續20秒。爲什麼?Bash多線程速度問題

我正在使用8 GB Ram + i5-2450M(4CPU〜2,4Ghz)+ SSD的基本OS 64位(ubuntu 14.04)上執行。

序列碼。

#!/bin/bash 

space="a b c d e f g h i j k l m n o p q r s t u v w x y z" 

if [ $# -le 1 ] 
then 
    echo "Ussage: " $0 SALT PASSWORD_CODED 
    exit 
fi 
echo $2 
echo $1 
for i in $space 
do 
for j in $space 
do 
for k in $space 
do 
    #echo $i$j$k 
    variable=$(openssl passwd -crypt -salt "$1" "$i$j$k") 
    if [ "$variable" = $2 ] 
     then 
     echo password found: $i$j$k 
     exit 
    fi 
done 
done 
done 

多線程代碼。

space="a b c d e f g h i j k l m n o p q r s t u v w x y z" 

if [ $# -le 1 ] 
then 
    echo "Ussage: " $0 SALT PASSWORD_CODED 
    exit 
fi 

calculate1() 
{ 
    for i in $space 
    do 
    for j in $space 
    do 
    for k in $space 
    do 
     variable=$(openssl passwd -crypt -salt "$1" "$k$j$i") 
     if [ "$variable" = $2 ] 
      then 
      echo password found: $k$j$i 
      date 
      exit 
     fi 
    done 
    done 
    done 
} 

calculate2() 
{ 
    for i in $space 
    do 
    for j in $space 
    do 
    for k in $space 
    do 
     variable2=$(openssl passwd -crypt -salt "$1" "$i$j$k") 
     if [ "$variable2" = $2 ] 
      then 
      echo password found: $i$j$k 
      date 
      exit 
     fi 
    done 
    done 
    done 
} 

date 
calculate1 $1 $2 & 
calculate2 $1 $2 & 

echo waiting 
wait 

爲什麼單線程和順序碼更快?

我可以使用C代碼而不是bash嗎? 與C中的variable2=$(openssl passwd -crypt -salt "$1" "$i$j$k")類似嗎?

+2

你一定要明白,你的水貨版本不分區這兩個過程之間的工作,而是讓每個人都完成所有的工作? – ruakh

+0

是的,但我認爲兩者工作在相同的速度。第一個從左側開始,第二個從右側開始。所以當他們完成了一半的工作時,他們已經有了密碼並且打印了它,因爲他們通過了所有組合 – user2911701

+0

,如果兩個「進程」試圖找到相同的答案,一個從左邊開始,另一個在右邊,那麼假設是不正確的兩個過程的速度都是一樣的。從右側開始的「序列代碼」運行一次流程,看看需要多長時間,我認爲這將花費接近20秒。 (想想這是爲什麼,並找到一個更好的方式來分裂你的工作。)正如前面在評論中提到的,你不是分裂工作負荷,如果你真的要這樣拆分它,你可能會增加或減少找到回答更快。 – jkdba

回答

1

一個例子劃分26個進程之間的工作:

#!/bin/bash 

s="$1"; p="$2" 
printf -v space "%s " {a..z} 
echo $s $p 

calc() { 
    for j in $space; do 
    for k in $space; do 
     variable=$(openssl passwd -crypt -salt "$s" "$i$j$k") 
     if [ "$variable" = "$s$p" ]; then 
     echo password found: $i$j$k 
     return 
     fi 
    done 
    done 
} 

for i in $space; do 
    calc & 
done 

wait 

測試:./script.sh 6 AGuqwGE0gkDg

輸出:

 
6 AGuqwGE0gkDg 
password found: xde