あなたは、事前にすべてのこれらのID値を知っている場合、あなたはhash tableを使用してそれらを確認することができます。同じバケツに着陸するかどうかを区別するのに必要な、各ハッシュ値のビット数だけを格納することで、スペースを節約できます。
、その後、あなたが苦労を持っているつもりではない場合、私は怖いです。
これらの128ビットのIDが暗号化ハッシュ関数の出力として生成されたとしましょう(たとえば、MD5)、各IDはランダムに一様に選択された128ビットに似ています。
あなたは32ビットの値にこれらを削減する場合は、あなたが達成したいと考えてできる最善のは、各ビットが均一な確率で0または1である32ビット数値のセットです。これを行うには、CRC32チェックサムを計算するか、単に96ビットを破棄するだけです。違いはありません。
32ビットは、衝突を回避するのに十分十分ではありません。衝突確率は、わずか93入力後に100万分の1を超え、2,900入力後に1000分の1を超えます。 77,000の入力の後、衝突確率は50%に達する。 (Source)。
はだからではなく、あなたの唯一の本当の選択肢は何とか小さな何かにID値をリバースエンジニアリング、またはシーケンシャル整数とこれらのIDを交換するいくつかの外部手段を実装することです(例えば、ハッシュテーブルを使用して)。
あなたは、任意の暗号化ハッシュを使用し、必要な長さに出力を切り捨てることができます。しかし、ユニークであることは保証されていません。 – zaph
Zaphが提案したように切り詰められたダイジェストが思い浮かびます。ただし、切り捨てられたハッシュが完全なハッシュと同じプロパティを持つという証明の減少がないので、注意してください。最低でも、関数は出力バッファサイズをビット単位でダイジェストする必要があります。ちょうど128ビットのUIDのようにハッシュにそれを送りなさい。また、[切り詰められたハッシュ]に関するKelseyの作業(https://www.google.com/search?q=kelsey+truncated+hash)も参照してください。 – jww
あなたが一意にマッピングすることはできません^ 128 2 - > 2^32([鳩の巣原理](https://en.wikipedia.org/wiki/Pigeonhole_principle))。実際の制約が何であるかに応じて、128ビット数を2 64ビット値または4 32ビット値として格納できます。余分な12バイトの周りをドラッグするのは面倒ですが、おそらくあなたがしているかもしれない文字列よりも少なくなります。 – bartonjs