Oto bez kodowania mieszania, do szybkiego 3:
func strHash(_ str: String) -> UInt64 {
var result = UInt64 (5381)
let buf = [UInt8](str.utf8)
for b in buf {
result = 127 * (result & 0x00ffffffffffffff) + UInt64(b)
}
return result
}
ona pochodzi nieco od C++ 11 constexpr
constexpr uint64_t str2int(char const *input) {
return *input // test for null terminator
? (static_cast<uint64_t>(*input) + // add char to end
127 * ((str2int(input + 1) // prime 127 shifts left almost 7 bits
& 0x00ffffffffffffff))) // mask right 56 bits
: 5381; // start with prime number 5381
}
Niestety, dwóch nie wytworzeniem ten sam skrót. Aby to zrobić trzeba by odwrócić kolejność iterator w strHash:
for b in buf.reversed() {...}
Ale to będzie działać 13x wolniej, w pewnym sensie przyrównać do rozszerzenia djb2hash ciąg, który dostałam od https://useyourloaf.com/blog/swift-hashable/
Tutaj są pewne punkty odniesienia, za milion powtórzeń:
hashValue execution time: 0.147760987281799
strHash execution time: 1.45974600315094
strHashReversed time: 18.7755110263824
djb2hash execution time: 16.0091370344162
sdbmhash crashed
dla C++, str2Int jest mniej więcej tak szybko jak Swift 3'S hashValue:
str2int execution time: 0.136421
jeśli to może być proste, dlaczego nie użyć skrótu [MD5 hash] (http://stackoverflow.com/a/2018626/1219956) edit: [wersja skrócona] (http://stackoverflow.com/questions/24123518/ how-to-use-cc-md5-method-in-swift-language) – Fonix
@Fonix Tak, to może być rozwiązanie. Istnieje wiele odpowiedzi na pytanie, które łączysz - czy mógłbyś polecić każdemu z tych, którzy mają stabilną i szybką implementację skrótu MD5 w Swift? – drasto
zobacz drugi link w moim pierwszym komentarzu, ale poza tym istnieje mnóstwo rozwiązań z szybkim google – Fonix