2016-03-09 31 views
6

W dokumentacji String.hash dla iOS mówi:Wartość skrótu łańcucha, która byłaby stabilna w wersjach systemu iOS?

Nie należy polegać na tej nieruchomości o tej samej wartości hash całej wydaniach OS X.

(dziwne, dlaczego mówią o OS X w Dokumentacja iOS)

Cóż, potrzebuję funkcji hasshing, która nie ulegnie zmianie w przypadku wersji iOS. Może to być proste Nie potrzebuję niczego takiego jak SHA. Czy jest tam jakaś biblioteka?

Jest jeszcze jedno pytanie dotyczące tego here, ale przyjęta (i jedyna) tam odpowiedź po prostu stwierdza, że ​​powinniśmy uszanować notatkę w dokumentacji.

+1

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

+0

@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

+0

zobacz drugi link w moim pierwszym komentarzu, ale poza tym istnieje mnóstwo rozwiązań z szybkim google – Fonix

Odpowiedz

5

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