需要帮助加快计算速度

时间:2016-09-19 04:37:04

标签: ios swift performance hash levenshtein-distance

我写了一个程序,在打印出的帐单上生成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()方法:

1 个答案:

答案 0 :(得分: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
}