2016-09-19 175 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()方法太慢,無法每秒生成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

您可能只需將該循環改回計數循環即可。但是,你想索引或單詞?如果你想要這個單詞,那麼函數應該返回'String?'而不是'Bool',然後返回祕密字或'nil'。另外,它看起來不像'generateAll'應該是'String'的擴展。至少沒有以這種方式實現'secretWord.generateAll()'會更有意義 – Paulw11

+0

出於興趣,最小編輯距離的目的是什麼?是否允許在散列項中輸入密鑰或OCR錯誤? – Paulw11