2016-09-19 11 views
-1

印刷された請求書にmd5ハッシュを生成するプログラムを作成しました。私は生成されたハッシュのリストに対してハッシュをチェックできるようにしたい。次に、Levenshtein距離関数を使用して、プリントアウトされた請求書から編集距離が最も小さいハッシュを特定します。私は毎秒このメソッドを複数回実行することができるようにしたい計算を高速化する助けが必要

func checkIfBillIsLegit(stringToCheck:String) -> Bool { 
    for i in 0...((secretWords.count)) {         // for loop runs about 5 times 
    let hashs = String().generateAll(secretWords[i])     // create the md5 hashs to check against, returns an array with 50 elements 
    for j in 0...(hashs.count) { 
     if (stringToCheck.minimumEditDistance(hashs[j]) < 5) {  // Levenshtein distance function 
      print("legit") 
      print(secretWords[i]) 
      return true 
     } 
    } 
    } 

    print("not legit") 
    return false 
} 

は、ここに私のコードです。今は動作しますが、やりたいことが少し遅すぎます。問題は、generateAll()メソッドが遅すぎて1秒あたり50ハッシュを生成できないことです。私はこのメソッドの外でgenerateAllを呼び出すことを考えていましたが、どのようにリストを追跡することができるのか分かりません。

ご協力いただければ幸いです。

generateAll()メソッド:

+0

「secretwords」の配列はどのくらいの頻度で変更されますか? – Paulw11

+0

このビューコントローラの外でsecretwordsの変更の配列。私たちはそれが決して変わらないと考えることができます。 – mawnch

+0

ハッシュを一度計算し、各単語のハッシュの配列を辞書[String:[Hash]]に格納することができます。遅延プロパティを使用すると、ハッシュが最初に必要なときに計算されます。あるいは、辞書ミスのハッシュを計算することができるので、単語が配列に追加されると、システムは自動的に新しいハッシュを計算します。あなたは辞書ではなく 'NSCache'を使うこともできます – Paulw11

答えて

0

あなたが必要なときにのみ、特定の単語のためのハッシュを計算することを確実にするためにNSCacheを使用することができます。通常、これはあなたの関数が呼び出された最初の時間になりますが、秘密の単語の配列が展開されている場合、それはまた次のようになります。

var hashCache = NSCache() 

func checkIfBillIsLegit(stringToCheck:String) -> Bool { 

    for secretWord in secretWords {         
     var hashes = hashCache.objectForKey(secretWord) as? [Hash] 
     if hashes == nil { 
      hashes= String().generateAll(secretWord) 
      hashCache.setObject(hashes, forKey: secretWord) 
     } 

     for hash in hashes! { 
      if stringToCheck.minimumEditDistance(hash) < 5 { 
       print("legit") 
       print(secretWord) 
       return true 
      } 
     } 
    } 
    print("not legit") 
    return false 
} 

あなたが「秘密の言葉は」試合だったかを知りたい場合は、私は希望返す関数を変更するString?

var hashCache = NSCache() 

func checkIfBillIsLegit(stringToCheck:String) -> String? { 

    for secretWord in secretWords {         
     var hashes = hashCache.objectForKey(secretWord) as? [Hash] 
     if hashes == nil { 
      hashes= String().generateAll(secretWord) 
      hashCache.setObject(hashes, forKey: secretWord) 
     } 

     for hash in hashes! { 
      if stringToCheck.minimumEditDistance(hash) < 5 { 
       print("legit") 
       print(secretWord) 
       return secretWord 
      } 
     } 
    } 
    print("not legit") 
    return nil 
} 
+0

ありがとう!正しい最小編集距離を持つハッシュのインデックスがまだ必要です。それをどうやって得るのですか?それはhashes.indexOf(ハッシュ)ですか? – mawnch

+0

おそらくループをカウントされたループに戻すことができます。しかし、あなたはインデックスまたは単語が欲しいですか?単語を望むなら、関数は 'Bool'ではなく' String? 'を返し、秘密の単語または 'nil'を返すべきです。また、 'generateAll'は' String'の拡張でなければなりません。 'secretWord.generateAll()'がより意味をなさないように少なくとも実装されていません – Paulw11

+0

興味がありません、最小編集距離の目的は何ですか?ハッシュのエントリにキーイングまたはOCRエラーが発生する可能性はありますか? – Paulw11

関連する問題