web-dev-qa-db-ja.com

「言語セーフ」なUUIDを生成する方法は?

私は常にリソースのIDにランダムに生成された文字列を使用したかったので、次のような短いURLを使用できます:/ user/4jz0k1

しかし、ランダムな文字列の生成が実際の単語を作成することを心配していたので、たとえば、/ user/f * ckerのように、私はそうしませんでした。これは2つの問題を引き起こします。それはユーザーを混乱させるか不快にさえする可能性があり、SEOを混乱させる可能性もあります。

次に、2文字ごとに数字を追加するような固定パターンを設定するだけでよいと思いました。 「generate_safe_uuid」メソッドには非常に満足していましたが、生成された実際の単語の比率が増加したため、SEOの方が優れているだけでなく、ユーザーにとっても悪いことに気付きました。例:/ user/g4yd1ck5

今、私はメソッド 'replace_numbers_with_letters'を作成し、それが辞書などに対して単語を形成していないことを確認できると考えています。

他のアイデアはありますか?

ps。これを書いているとき、複数の言語(例:英語とフランス語、スペイン語など)で単語をチェックするのは面倒で、数字のみのIDが再び好きになり始めていることにも気付きました。

[〜#〜]更新[〜#〜]

誰もが読むべきいくつかのリンク:

http://thedailywtf.com/Articles/The-Automated-Curse-Generator.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx

20
HappyDeveloper

意味のない単語を誤って作成する可能性を低くするいくつかのヒント:

  • 「-」、「!」などの非アルファ、非数値の文字をミックスに追加します。または「_」。
  • 「zx」や「aa」などの実際の単語では発生しそうにない(単一の文字ではなく)文字のシーケンスを累積してUUIDを作成します。

これは、いくつかのC#サンプルコードです(.NET 4を使用)。

private string MakeRandomString()  
{  
    var bits = new List<string>()  
    {  
            "a",  
            "b",  
            "c",  
            "d",  
            "e",  
            //keep going with letters.  
            "0",  
            "1",  
            "2",  
            "3",  
            //keep going with numbers.  
            "-",  
            "!",  
            "_",  
            //add some more non-alpha, non-numeric characters.  
            "zx",  
            "aa",  
            "kq",  
            "jr",  
            "yq",  
            //add some more odd combinations to the mix.  
    };  

    StringBuilder sb = new StringBuilder();  
    Random r = new Random();  
    for (int i = 0; i < 8; i++)  
    {  
        sb.Append(bits[r.Next(bits.Count)]);  
    }  

    return sb.ToString();  
}  

これはあなたが誰かを怒らせないことを保証するものではありませんが、私はあなたがそれほど高く狙うことができないという@DeadMGに同意します。

6
CesarGon

いたずらな単語リスト、文字置換リストを作成し、生成されたIDがいたずらな単語である場合は、やり直します。

たとえば(疑似コード)

naughty_words = ["ass", "shit", "boobs"]
substitutions = {
    "4" : "a"
    "1" : "i"
    "3" : "e"
    "7" : "t"
    "5" : "s"
    "0" : "o"
    // etc.
}

function reducestring (str) {
    newstr = ""
    for (character in str) {
        if (substitituions[character]) newstr += substitutions[character]
        else newstr += character
    }
    return tolower(newstr)
}

do {
    new_id_numeric = random_number()
    short_id = compress_to_alphanumeric(new_id_numeric) // 0-9, a-z, A-Z
    // that function should create a base 62 number
} while (!contains(naughty_words, reducestring(short_id))

(base 62ハッシュ/変換の詳細については、 これ のような他の短いURLの推奨事項を参照できます)

これで、a55sh1t、または "b00bs"などのIDを取得できなくなりました。明らかに、あなたの文字置換リストはあなたのいたずらな言葉に文字を含める必要があるだけです。

「455」を「ass」として読む人はいないので、文字が含まれていない場合はreducestringreturn strを使用することもできます。

グラフィックデザインサイト Dribbble には、投稿用の独自の短い文字列IDがあります。これらは http://drbl.in/dCWi のように0-9、a-z、A-Zを使用します。

私はいくつかの実験を行い、少なくともいくつかのいたずらな単語の短いIDがあります。彼らがfに到達したときに表示されると思いますが、まだそこにはありません。

確かに-投稿だけでなく、ユーザーに個人を特定するURL(/user/whatever)をユーザーに与えるのは、いたずらな言葉を使うとはるかに悪くなります。

5
Nicole

代わりに、数値または16進数のキーの使用を検討してください。 i18n対応の冒とく的なフィルターを作成する場合に比べて、多くの問題を解決できます。また、心配する必要がある最悪の事態は dead beef です。

5
user34530

自動化されたシステムがユーザーに不快な文字列を生成するのを防ぐことはできません。たとえば、中国では一部の数字が不運と見なされています。

実際にできることは、IDがランダムであり、内容が無関係であり、/user/fuckerそれなら、彼らはそれを無視すべきです。これらのことが起こり、それを回避することは技術的に実現可能ではありません-冒とくをフィルタリングすることができないのと同じように。

3
DeadMG

採用できる戦略は基本的に2つあります。

  1. 不快な文字列を生成しないシステムを作成します。たとえば、子音の文字からのみIDを作成できます。すべての母音を省略することにより、システムがいたずらなどの英語の単語を生成しないようにすることができます。

  2. 完全にランダムなIDを生成した後、新しいIDに不快な部分文字列が含まれていないことを確認してください。

2
Caleb

多くの状況(メールスパム、IPブロッキングなど)では、ブラックリストは負けゲームです。発生する可能性のあるすべての悪いことの「完全な」ブラックリストを作成することはできません。 abcdef

多くの人々は、受け入れ可能な単語のホワイトリストを使用し、それらをランダムな順序でまとめます。 (おそらく、各単語の間にダッシュ、ドット、またはスペースを入れます)。

任意の数を発音可能な一連の単語に変換するために使用されるいくつかの一般的な辞書には、次のものがあります。

1
David Cary

ランダムに生成された数値だけにするか、攻撃的なものをキャンセルする正規表現を使用できます。

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid
0
Billjk