「言語に安全な」UUIDを生成する方法は?


20

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

しかし、実際には、/ user / f * ckerなどの実際の単語を作成するランダムな文字列の生成が心配だったため、私は決してしませんでした。これには2つの問題があります。それはユーザーを混乱させたり、不快感を与えたり、SEOを混乱させる可能性があります。

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

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

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

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

更新

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

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

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


ハッシュまたはチェックサムを使用しますか?ランダムな文字列を使用する場合、アルファベットのすべての文字を使用する必要があるというルールはありません。
オースティンヘンリー

21
uuidとは呼ばないでください。uuidは普遍的に一意の識別子です。使用できる識別子の特定のシステムを指します。ここでやっていることではないので、その用語は使わないでください。
ウィンストンイーバート


1
@HappyDeveloper、まず、普遍的ではありません。これはアプリケーションに固有です。次に、uuidはen.wikipedia.org/wiki/Universally_unique_identifierを具体的に参照しますが、ユーザーが考案した類似のスキームではありません。
ウィンストンイーバート

2
これは非常に頭脳の無駄です。それが実際に起こってのチャンスは価値がさえ...について考えることをあまりにも小さいです
マイケルBorgwardt

回答:


6

意味のある単語をうっかり作成してしまう可能性を低くするためのいくつかのヒント:

  • 「-」、「!」などの非アルファ、非数値文字をミックスに追加します または「_」。
  • 「zx」や「aa」などの実際の単語では発生しそうにない文字列(1文字ではなく)を蓄積して、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に同意します。


1
非英数字の問題は、それらの一部がURIでうまく動作しないことです(エスケープされた文字につながります。これは小さなURLでは大きなノーです:bit.lyとtinyurlがそれらを使用していない理由があります)。もう1つの問題は、ユーザーにとって直感的でないことです。たとえば、ポストイットに書き留めたり、電話で送信したりすることは簡単ではありません(多くの非技術者は、例)。ここでも、小さなurlとbit.lyがそれらを使用しない理由があります。
-user988052

@ user988052:したがって、いくつかの非アルファ、非数値文字。URIには問題なく、人間には十分簡単ないくつかを選択するのは簡単です。
CesarGon

「したがって、いくつかの非アルファ、非数値文字。」[原文] ... URL短縮サービス(bit.ly、tinyurl、t.co、goo.glなど)は、「いくつか」よりもアルファベット以外のゼロのほうが優れていると考えているようです。そして、以前のコメントで説明した理由は、これらのサービスがあなたの観点に同意しない理由の説明の一部だと思います。今明らかに私たちの意見は問題に関して異なっています。)
-user988052

@ user988052:私は長年goo.glを使用してきましたが、あらゆる種類の非アルファ文字の変換に問題はありませんでした。唯一の例外は%です。これは、サービスのディスカッショングループで文書化されています。あなたの主張を裏付ける参考資料を提供できますか?
CesarGon

1
OPは、彼が短い名前を望んでいると述べ、これらを生成する方法を求めます。「息子に非アルファ、非数値文字をミックスに追加する」ことを提案します[原文]。それで、あなたは何を提案していますか?そのOPは最初に「何か」を生成し、それをtinyurl / bit.lyに送信しますか?私はそれがOPが望んでいるものではないと思います。OP は、比較的「小さな」URL を直接生成したいと考えています。私が言っているのは、それが彼が後のものである場合、tinyurl / bit.lyがやっているように、彼がalphanumアルファベットを使用する方が良いかもしれないということです!今私は本当にオフです。
user988052

5

いたずらな単語リスト、文字置換リストを作成し、生成された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))

(ベース62のハッシュ/変換に関する情報については、このような他の短いURLの推奨事項を参照できます)

今、あなたは、もはやなどのIDを取得していないa55sh1tまたは「b00bsを」。明らかに、文字の置換リストには、いたずらな単語に文字を含めるだけで済みます。

誰も「455」を「ass」と読むことはないので、文字が含まれていない場合は「return strin 」にしたいと思うかもしれreducestringません。

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

私はいくつかの実験を行いましたが、少なくともいくつかのいたずらな言葉には短いIDがあります。私たちは彼らがいつ到着するかを見るでしょうfが、彼らはまだそこにいません。

付与- /user/whatever単なる投稿ではなく、ユーザーに個人を特定するURL()を与えることは、いたずらな言葉でさらに悪化します。


2
オンラインサービスのパスワードを生成するプログラムを書いたことがあります。それらはランダムでしたが、それらをかなり発音できるようにするいくつかの発見的手法があったため、それらはより簡単に覚えられるでしょう。そして、これらの発見的手法は冒とくにつながりました。解決策は次のとおりです。下品な単語と同様に発音できる下品な部分文字列(FUCやFUKなど)を確認し、パスワードを再生成します。(笑いのために、プログラムは拒否されたパスワードを別のファイルに
書き込みました

1
そして、あなたはどのようにすべての言語のためにそのようなことを書くつもりですか?
DeadMG

1
@DeadMGすべての可能性のある不快な単語の完全なセットでは、これはそのセットを小さくすることしかできません。あなたのスタンスは本当に「あなたは100%に達することができないので、それは自動的に何もする価値がない」ですか?
ニコール

UTF-8はどうですか?この置換を回避する代替の印刷可能な文字がたくさんあります。
-JBRウィルキンソン

1
OPがIDの英数字の文字セットを設定しているため、適用されない@JBRWilkinsonですか?
ニコール

5

代わりに、数字または16進キーの使用を検討してください。i18n対応の冒fan的なフィルターを作成する場合と比較して、多くのトラブルを軽減できます。また、心配する必要がある最悪の事態は死んだ牛肉です。


1
+1:これは最も簡単で安全なソリューションだと思います。数値の形式でuuidを生成し、それに文字列表現(10進数、16進数、8進数)を使用できます。
ジョルジオ

4
あなたはまだ心配する必要がありB16B00B5ます:P
CodesInChaos

3

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

本当にできることは、IDがランダムであり、コンテンツが無関係であることをユーザーに伝える/user/fuckerことです。これらのことは起こりますが、それを避けることは技術的に実行可能ではありません-冒とくを決してフィルタリングできないように。


9
私は支持者ではありませんが、不快な言葉に対しては、「無視するべきだと彼らに言う」よりも、はるかに多くのことを本当に行う必要があると強く感じています。少なくともできることは、生成されたIDを受け入れ可能なものに変更する方法を提供することです。
マルジャンヴェネマ

4
私もダウンボーターではありませんが、@ MarjanVenemaに同意します。/user/f*ckerは受け入れられません
HappyDeveloper

@HappyDeveloper:以前に提案したように、あなたはそれについて何をするつもりですか?ユーザーが不快と感じるIDが与えられるのを防ぐことはできません。
DeadMG

3
@DeadMG いくつかの一般的に不快なケースを防ぐことで、状況を改善できます。元の質問がそれをかなり明確にしたと思いました。
ニコール

2
@NickC:唯一の例は、英語では一般的に不快です。アラビア語、ポルトガル語、中国語、ロシア語で一般的に不快なことは何かありますか?これらの言語には、非常に多くの形をとる不名誉があるかもしれないという事実は言うまでもありません。英語の単語の明白な形式を特殊なケースにするのは簡単ですが、誰にとってもそう簡単ではありません。
DeadMG

2

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

  1. 不快な文字列を生成しないシステムを作成します。たとえば、子音文字のみからIDを作成できます。すべての母音を除外することで、システムが英語の単語をいたずらやその他の方法で生成しないことを確認できます。

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


1

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

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

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


0

ランダムに生成された数字にするか、不快な数字をキャンセルする正規表現を使用することができます。

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid

2
おかしい、私はそれらのいずれかを不快とは思わないだろうから。
-DeadMG

私はそれがSEサイト上の実際の呪いの言葉を投稿するだけで厄介な主題だ...知っている:meta.stackexchange.com/questions/22232/...
Billjk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.