2016-03-09 3 views
6

それは言う:iOSリリースで安定した文字列のハッシュ値? iOS用のドキュメント<code>String.hash</code>で

彼らはOS Xの話、なぜあなたは奇妙な(OS Xの リリース

で同じハッシュ値を持つこのプロパティに依存しないでくださいiOSのドキュメント)

さて、iOSリリースでは変更されない機能が必要です。シンプルにすることができます。私はSHAのようなものは必要ありません。そのためのライブラリがありますか?

このhereに関するもう1つの質問がありますが、そこに受け入れられた(そして唯一の)答えは、単に文書の注釈を尊重すべきだと述べています。ここで

+1

シンプルにできれば、[MD5ハッシュ](http://stackoverflow.com/a/2018626/1219956)編集:[swift version](http://stackoverflow.com/questions/24123518/) how-to-use-cc-md5-method-in-swift-language) – Fonix

+0

@Fonixはい、解決策になる可能性があります。あなたがリンクしている質問にはたくさんの答えがあります。スウィフトでMD5ハッシュを安定して高速に実行できるものをお勧めしますか? – drasto

+0

私の最初のコメントの2番目のリンクを参照してください。それ以外の場合は、クイックグーグルのソリューションがたくさんあります – Fonix

答えて

5

はスウィフト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 
関連する問題