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