はスウィフト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
}
これは、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
}
からやや派生した、2は得られません。同じハッシュ。あなたはstrHashでイテレータの順序を逆にする必要があるだろうことを行うには:
for b in buf.reversed() {...}
をしかし、それは、私はいくつかのベンチマークである。ここhttps://useyourloaf.com/blog/swift-hashable/
からもらったdjb2hash文字列の拡張子にやや匹敵し、13Xが遅くなるだろう、百万回の繰り返しのために:C++の場合
hashValue execution time: 0.147760987281799
strHash execution time: 1.45974600315094
strHashReversed time: 18.7755110263824
djb2hash execution time: 16.0091370344162
sdbmhash crashed
、str2Intは早くスウィフト3のハッシュ値とほぼです:
str2int execution time: 0.136421
シンプルにできれば、[MD5ハッシュ](http://stackoverflow.com/a/2018626/1219956)編集:[swift version](http://stackoverflow.com/questions/24123518/) how-to-use-cc-md5-method-in-swift-language) – Fonix
@Fonixはい、解決策になる可能性があります。あなたがリンクしている質問にはたくさんの答えがあります。スウィフトでMD5ハッシュを安定して高速に実行できるものをお勧めしますか? – drasto
私の最初のコメントの2番目のリンクを参照してください。それ以外の場合は、クイックグーグルのソリューションがたくさんあります – Fonix