質問

初めればいいなと思っていることを確保するための私がその事実を認識し、その幅は、良識ある。しかし今聴いたの意見を行うにはどのようなアプローチだ。

私ビルアプリケーション、遠隔ノードを主体が指定されたUUID.最終的には、すべての事業体は集まった専用のドレインノードのすべての主体によるこのUuid.

現在のを作りたい追加の識別子ですが、お手軽人ます。Base64エンコーディングのUuidが作成Id22文字が適切でない人。ながらやっていく必要があるようなものURL短縮サービス適用bijective機能しない、助けでな削減の情報の値とします。もちろん、私が認識していただいたな情報を短縮のためのidです。んもその削減の情報ハッシュする可能性が増加し衝突.私はこだわった、最適な方法で軽減するための情報を短idます。

この前提条件:をご提供させて頂きますの地図{UUID短ID}っているデータを保管します。いう非集中。いいように約百万円のId(~2^20)。

この考えが浮かび上がったか

  • オート増分Id: いものを使うオートidを忘れたが、このidをobfuscated文字列とのことです。この最も簡単なアプローチが続いているときは、複数のキー周辺のキーはつながらないこと。しかしい思いをご紹介しの集中対象となる事はしないんです。
  • 短縮のUUID: 私だけかのビットの独自のuuidの128ビット.その後は少なくともののUUID.やはり何か。
  • 幅のUUID: 私は応用できることを見いだした。第二のハッシュアルゴリズムに最初のUUIDのマッピングしました。

その他の方法?何が好?

感謝。

役に立ちましたか?

解決

1))あなたは、単に下と上半分をXOR(そして、それはあなたのために十分に短いですまで繰り返すことができ、UUIDを短くします。これは、分布特性を保持します。出力を短縮すべてのソリューションは、それが原因の誕生日のパラドックスへの衝突の可能性を増加させると同じように、

2)XORは些細なハッシュになるが、追加の混合が必要とされないので、それは大丈夫です。あなたのUUIDにCRCまたは非暗号ハッシュを使用することができますが、私はそれが任意の改善だとは思わない。

あなたがのいくつかのの中央管理を受け入れるために喜んでいる場合は、

3)、それが苦痛である必要はありません。中央当局は、IDを割り当てるとき、クライアントはそのサブ範囲を反復処理することができ、各クライアントにアドレス空間の中規模のブロックを分け与えることができます。これは、衝突がないことを保証するだけでなく、各IDのラウンドトリップを回避できます。それを行う1つの方法は、一度に16ビットのブロックをdoling、IDの32ビットの整数を使用することであろう。つまり、最初のクライアントが0001FFFFに00010000を可能にする、0001を渡されます。

4)あなたはUUIDを使用してデータベースに挿入するだけでなく、アイデンティティのフィールドを持つことができます。これは32ビット整数に限定することができる代替の、よりコンパクトなユニークIDを提供するであろう。

他のヒント

あなたはUUIDをより読みあなたが人間に優しい用語の辞書を選んで、(部品の)を作るためにそれらを使用し、外部エイリアシングアプローチを、使用して考えがあります

de305d54-75b4-431b-adb2-eb6b9e546013

65536語の辞書を使用することになる可能性があります:

de305d54-zebra-stackoverflow-extraneous-eb6b9e546013

これにより、ユーザーはこれらの人間が読める名前を持つ精神的なハッシュ衝突(シマウマが二回発生)が表示されますと、データベースのサイズが成長しないということはほとんどありません。翻訳が全単射と純粋にUIです。

心にポップなものだけのカップルます:

あなたのユースケースとは何ですか?あなたの懸念は、あなたが分散してIDを生成するということであれば、1つの解決策は、それが独自のint型のIDが各マシンを割り当て、そのIDの接頭辞や接尾辞としてそれを使用することです。

中央エンティティを持っていないことで、あなたも、ローカルのIDを追跡して何も意味しない場合は、

これは本当に助けにはなりません。あなたはUUID自体からページを借りて、上記のように割り当てられたマシンIDと連動してシステム時刻を使用することができます。これはあなたのマシンIDが何であってもサイズ64-ビット+まであなたを得るでしょう。基本的に、これはあなたがマシンIDのMACアドレスよりも短いものを使用している以外、UUID V1スキームです。あなたが> = 2010年2月12日の日付で開始することができます知って考えると、あなたはさらに短縮できるとすることができる。

あなたがまだの場合は、あなたがあなた自身を構築する方法については、そこからアイデアや2を得ることがwikipediaのUUIDエントリをチェックします。

ここで私が書いた簡単なハッシュアルゴリズムです。あなたがこれを使用することができます...あなたは簡単に衝突する可能性対読みやすさをトレードオフするために、入力と出力のマッピング、およびハッシュの長さを変更することができます。

このアルゴリズムは、セキュアまたはその効率的になるように設計されませんが、トリックを行う必要があります。

public class HashTools {

  final static String inputMapping = "0123456789ABCDEF";

  final static String[] outputMapping = new String[] {
      "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
      "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
  };

  /* Input: String - containing mostly letters / numbers
   * Output: <hashLength> String using 0-9,A-Z encoding
   */
  public static String simpleHash(String str, int hashLength) {
    StringBuilder hashStr = new StringBuilder(hashLength);
    String strUpper = str.toUpperCase();
    int[] hash = new int[hashLength];

    int i, j, num;
    for (i = 0; i < strUpper.length(); i++) {
      char strChar = strUpper.charAt(i);
      num = mapCharToInt(strChar);

      j = i % hashLength;
      hash[j] += num;
    }

    for (i = 0; i < hashLength; i++) {
      hashStr.append(mapIntToHashChar(hash[i]));
    }

    return hashStr.toString();
  }

  private static int mapCharToInt(char hexChar) {
    return inputMapping.indexOf(hexChar);
  }

  private static String mapIntToHashChar(int num) {
    return outputMapping[num % outputMapping.length];
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top