1

私は現在、英単語アプリに取り組んでいます。すべての単語が互いに異なるため、すべての単語に異なる int id が必要です。整数 (または long ?) を簡単に割り当てることができると思います。

アルファベット順にIDを連続して与えたくありません。この要件に対応する既存のアルゴリズムが存在する可能性があると思います。独自の車輪を発明したくないので、助けてください。

1 つの単語リストには何百、何千もの単語が含まれる可能性があるため、構造をコンパクトにしてインターネット経由で転送できるように十分小さくしたいので、整数 ID を好みます。

次のようなデータ構造があるとします。

struct word {
  int wordId;
  byte familiarity;
}
// I prefer the mapping like this
apple -> 0x1,  0x4
app   -> 0x2E, 0x2
ape   -> 0xEA, 0x1

アップデート:

さて、私がやろうとしているのは、ユーザーにいくつかの単語リストを提供することです。それぞれにいくつかの単語が含まれています。ユーザーはすでにいくつかの単語を学習している可能性があります (たとえば、リンゴ)。言葉、そして二度と現れないことを願っています。したがって、ユーザーがそれらの単語をスキップできるようにしたいと考えています。選択した単語はサーバーに送信されるか、ローカル ファイルに保持されます。単語またはフレーズ全体を送信する必要はないかもしれません。ここで質問を見つけました: http://stackoverflow.com/questions/7700400/whats-a-good-hash-function-for-english-words, もっと良い解決策はありますか?

4

1 に答える 1

0

はい、衝突のない完全なハッシュ アルゴリズムを見つけることは不可能のようです。マッピング ファイルを維持することになるかもしれません。また、ここで

素晴らしい質問と回答を見つけ ます。

実際、このアルゴリズムはすべてサーバー上で実行され、起動時に 1 回だけ実行されるため、このアルゴリズムのパフォーマンスは気にしません。私が欲しいのは、すべての単語/フレーズのIDが一意であり、指紋のようにできるだけ短いことだけです. 素数を利用できるのだろうか..

最後に、ID に long を使用することにします

(8 ビット) 最初の単語の最初の文字
(8 ビット) 最後の単語の最後の文字
(4 ビット) 単語数
(4 ビット) フレーズ内の最長の単語のシリアル番号
(8 ビット) 文字数、スペースを含む
(32 ビット) MurmurHash3 の結果

ここで murmurHash3 cs 実装を見つけることができ
ます

于 2013-03-19T07:38:46.250 に答える