2016-08-30 4 views
0

私の(比較的)古いコードのバグに遭遇し、Stringハッシュプロパティが密でユニークでないことが判明しました。多くの異なる文字列は同じハッシュ値を持ちます。スウィフト文字列ハッシュは永続データのインデックスに使用する必要がありますか?

docを参照すると、情報をまったく持たない「ハッシュテーブルアドレスとして使用できる符号なし整数」しか見つかりませんでした。

私のコードスニペットは、次のように簡単です:

func getCacheIndex(sUrl: String) -> Int { 
    return sUrl.hash 
} 

し、次のように生成し、与えられた別の文字列(XXXXXXXは置換キーの文字列を表しながら見出しparamは異なります)のために:

FileCache hash is -4052854053573130360 for url 
https://maps.googleapis.com/maps/api/streetview?size=675x900&location=46.414382,10.013988&heading=135&pitch=-0.76&key=XXXXXXXXXXXXXXXXXXX 

FileCache hash is -4052854053573130360 for url 
https://maps.googleapis.com/maps/api/streetview?size=675x900&location=46.414382,10.013988&heading=180&pitch=-0.76&key=XXXXXXXXXXXXXXXXXXX 

StringにはhashValueがありますが、それを実行する間に何かを保持するために使用しないでください。

あなたはこれをSwiftでどうやって解決しますか?私自身のハッシュコードを提供する必要がありますか?

+0

はい、安定したハッシュとより大きいダイジェストサイズが必要な場合は、独自のハッシュ関数を実装する必要があります。 SHA2-256のようなものは、256ビット長の(驚いた)ハッシュ値を出力します。ハッシュ衝突(すなわち、「ハッシュ(a)==ハッシュ(b)ここでa!= b」)は避けられない生命の事実である。しかし、何をしようとしていますか? –

+0

私は、URLに基​​づいてファイルにインデックスを付けるための安定版(複数回実行とiOS版)を探しています。助言がありますか? –

答えて

0

私は一時的にネイティブString.hashを私のアプリケーションのカスタムfuncで置き換えます。これは良く見かけの分布で、問題を解決する:

public func hash(_ string: String) -> Int { 
    func djb(_ string: String) -> Int { 

     return string.utf8 
      .map {return $0} 
      .reduce(5381) { 
       ($0 << 5) &+ $0 &+ Int($1) 
     } 
    } 

    return djb(string) 
} 

注:私は、ディストリビューション上で動作する時間がある時はいつでもDJBハッシュfuncがいつでも交換することができます。

関連する問題