2016-11-02 2 views
2

私のアプリケーションは、各ユーザが固有のナチュラルナンバーIDコードを作成して、短い文字列 "と同じ方法です。 「短い紐」部分はゲームにとって非常に重要です。多くのアクティブユーザがいるFirebase-DatabaseでカスタムショートIDを作成する方法

自然数インデックス&ショートストリングを格納するauto-idキーと、自然数をキーと前のauto-idキーとして含む別の子ノードを作成することを考えました。

私は2人のユーザーが同時に新しいIDを作成することはほとんどありません。理想的には、短い文字列を非常に短くするために、1000から始まるIDをインクリメントすることができます。

firebase-databaseを使用してこのタイプの問題を解決する方法は誰にも分かりますか?

長さが6文字以下の「短い文字列」を使用し、数字、大文字、ハイフンのみを使用したいと考えています。

これはできないかもしれません。乱数を生成してすべてのキーに追加するために、50文字のアルファベットを使用する必要があります。


ひとつのアイデアは、現在の最高のキーをチェックし、それに追加する乱数を生成することでしたが、2人のユーザーが同じ番号を取得することはできません保証はまだありません。


これまでのところ、私は2人のユーザーがオンラインユーザーのそれぞれの子ノードでの内部リストを保持していると同時に、新しいキーを生成しようとすると、おそらく競合状態を防ぐために持っている唯一の他のアイデアデータベースに投稿する前にキーを作成しておくと、ユーザーは他のすべてのユーザーの要求されたキーを確認する必要があります。

最後のアイデアは、オンラインで最後に接続が失われた場合にユーザーが再接続するたびにリストをチェックするコードが必要な、複雑なエラーが発生する可能性があるようです。

+0

idを短い文字列に変換するのは簡単です。ユーザーID 1001が "ABC123"の文字列を返し、1002が "ABC124"の文字列を返しても大丈夫ですか?または、1002が「Z7QJ48」になるようにそれらを「ランダムに見える」ようにしたいですか? –

+0

ランダムに見える必要はありません... 2人のユーザーが同時に1人を作成する場合、2人のIDが同じでないことを保証できるようにしたいだけです。 –

+1

答えはトランザクションを使用しているようです。 Firebaseのトランザクションは、2人のユーザが同じデータを同時に書くのを防ぎます。問題の解決策を作成したら、より詳細な回答を投稿します。 –

答えて

0

私は最終的にこの問題の解決策を思いつきました。

私はまた、アプリのAndroid版を作成していますので、Androidでこれと同じ方法を見つける必要があります。

私がしたことは、カウンターをインクリメントするトランザクションブロックを使用したことでした。カウンタが正常にインクリメントするたびに、対応する子ノードを更新する完了ブロックを実行します。

次の問題は、同じユーザーが一度に複数のインクリメントを実行する場合に発生しました。 (これは頻繁に起こることはありませんが、それは起こります)

トランザクションブロックはそれぞれ独自のスレッドを取得しますが、完了ブロックはメインスレッド上でキューに入れられ、トランザクションがすべて完了するのを待ちます。

GCDを使用して、DispatchQueueを使用して各増分操作に独自のスレッドを割り当てることができました。これで、ユーザーは必要な数だけ増分を実行することができ、アイテムに対応する独自のHashIdトラッキングコードを保証することができます。

私はFirebase Slackグループでこれについていくつかの助けを得ました....活発な議論を見つけるために行く良い場所!

乾杯!

1

hashidsは、数値を短い文字列に変換して戻す小さなスクリプトです(http://hashids.org/参照)。

このようにして、単純に増加カウンタを使用し、これらを短い文字列に変換することができます。

Firebaseでは、中央の「カウンタ」ノードを1つだけ増やすことができます(セキュリティルールを使用します)。クライアントは、トランザクションを使用してこのノードを1つ増やすことができます。結果の番号は、そのクライアントに対して一意に保証されます。 (2つのクライアントが同時にトランザクションを実行すると、トランザクションブロック内のコードが複数回起動できることに注意してください)。

ユニークな番号そのクライアントをhashidsと共に使用して、一意であることが保証された短い文字列を作成することができます。

注:これは、ユーザーが次のIDを推測できる「問題」を解決するものではありません。短い文字列は、文字列を作成するために使用されるsaltがある場合は数値に変換されます。次の短い文字列は、hashids関数を使用すると簡単に生成できます。したがって、短い文字列をクライアントに作成すると、saltもクライアントで認識され、ユーザーが抽出することができます。

もちろん、これは問題ではないかもしれません。

+0

ありがとうございます。それは私のアプリケーションで今使っている素晴らしいソフトウェアです。私の質問に答えることはできませんでしたが、これでコードを書く必要がなくなりました!乾杯!! +1 –

関連する問題