2017-12-09 14 views
0

私は一意の文字列のセットを一意のIDに変換するScalaコードに取り組んでいます。私はHashCode()を適用しましたが、負の数があり、正の数だけで作業する必要があります。 負の値を取り除くためにmath.absを使用する必要があることはわかっていますが、これが正しい解決法であるかどうかはわかりません。私はその前に読めば 、このようなものは、どのように私は右の定数を決定することができますhashCode()を適用すると肯定的な結果しか得られないのですか?

math.abs(hashCode()) * constant % size 

私の問題を解決するだろうか?サイズは文字列の総数を意味しますか?

これまでの質問ではmath.absのみを使用して問題を解決しましたが、文字列の総数が多い場合はオーバーフローが発生し、負の数を取得する可能性があります。結果に定数を掛けて、サイズのモジュレーションを取ることで助けになります。これが私が定数とサイズを決定する方法を理解する必要がある理由です。

また、ユニークな文字列のユニークな番号を取得する別の方法はありますか?

+1

[ユニークIDにハッシュコードを使用する](https://stackoverflow.com/questions/21368492/using-hashcode-for-a-unique-id) – Piro

+0

私の質問に対する回答はありませんでした上記の投稿。 – saad

+0

Math.abs()を単独で使う考えには欠陥があります:常に正の数を返すわけではありません!また、ハッシュコードが一意ではないことも説明してください。 – Piro

答えて

0

問題を別の方法で表現できます:同じ範囲の符号付き数値から符号なし数値を取得するにはどうすればよいですか?

Integerを使用しているとします。 0に上向きにあなたの範囲を移動するための定数を追加
:この値は、あなたが0


〜2147483647です。ステップ1正の範囲には、この値を変換する必要がある今、-2147483648から2147483647に行きます値に2147483648を追加することでこれを行うことができます。しかし、現在可能な限り高い値がMAXよりはるかに大きいです。

ステップ2:
だから、戻って必要な範囲に値を移動するためにMODULOを使用しています。例えば


、値-2000と2000000000.

| STEP    | MIN VALUE | EXAMPLE 1 | EXAMPLE 2 | MAX VALUE | 
|-------------------|------------|------------|------------|------------| 
| original   |-2147483648 | -2000 | 2000000000 | 2147483647 | 
| add 2147483648 |  0  | 2147481648 | 4147483648 | 4294967295 | 
| modulo 2147483648 |  0  | 2147481648 | 2000000001 | 2147483647 | 

を考慮する最終的な式は次のとおり

(NUMBER + 2147483648) % 2147481648 

警告:
ハッシュコードは一意の値を与えるようには設計されていません。 2つの異なる文字列に対して同じハッシュを得る機会があります。また、ハッシュのスケーリング演算(除算、モジュロなど)は、一意性をさらに低下させる可能性があります。

0

Intの標識を削除するには、.absを使用します。それはInt.MinValueに壊れるんが、それだけの特別なケースをすることができます:

def stripSign(n: Int) = math.abs(n) max 0 

または単に符号ビットドロップ:(とにかく彼らと間違って何?)

def stripSign2(n: Int) = n & Int.MaxValue 

それとも、負の数値を使用します。

あなたの他の質問に、あなたはint型にユニークな文字列の束を変換し、あなたの場合は、そこに明確なInt s以下よりの文字列があるという単純な理由のための重複(こと、そうではないという保証はありません文字列が足りなくなる前に整数を使い果たしてしまいます)、頻繁には衝突を処理する必要があります。

ハッシュを長くすると、衝突の確率を下げるためにしか撮影できません(32ビットのハッシュコードでは、約75000文字列の集団に少なくとも1回の衝突確率が約50%あり、31ビットが(マイナスの数字を必要としない場合)55000ですが、64ビットのハッシュでは、 "マジックナンバー"は約5 ですが、ハッシュ関数が十分であれば非常に均等に分布している)。

関連する問題