Bagaimana cara menghasilkan UUID "aman-bahasa"?

20

Saya selalu ingin menggunakan string yang dibuat secara acak untuk ID sumber daya saya, jadi saya bisa memiliki URL yang lebih pendek seperti ini: / user / 4jz0k1

Tapi saya tidak pernah melakukannya, karena saya khawatir tentang pembuatan string acak menciptakan kata-kata yang sebenarnya, misalnya: / user / f * cker. Ini membawa dua masalah: itu mungkin membingungkan atau bahkan menyinggung bagi pengguna, dan itu bisa mengacaukan SEO juga.

Kemudian saya pikir yang harus saya lakukan adalah mengatur pola tetap seperti menambahkan angka setiap 2 huruf. Saya sangat senang dengan metode 'generate_safe_uuid' saya, tetapi kemudian saya menyadari bahwa itu hanya lebih baik untuk SEO, dan lebih buruk bagi pengguna, karena itu meningkatkan rasio kata-kata aktual yang dihasilkan, misalnya: / user / g4yd1ck5

Sekarang saya berpikir saya bisa membuat metode 'replace_numbers_with_letters', dan periksa bahwa itu belum membentuk kata apa pun terhadap kamus atau sesuatu.

Ada ide lain?

ps. Ketika saya menulis ini, saya juga menyadari bahwa memeriksa kata-kata dalam lebih dari satu bahasa (misalnya: bahasa Inggris dan Perancis, Spanyol, dll) akan berantakan, dan saya mulai menyukai nomor-nomor ID lagi.

MEMPERBARUI

Beberapa tautan yang setiap orang harus baca:

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

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

HappyDeveloper
sumber
Gunakan hash atau checksum? Jika Anda lebih suka menggunakan string acak, tidak ada aturan bahwa Anda harus menggunakan setiap huruf dalam alfabet.
Austin Henley
21
Jangan menyebutnya uuid, uuid adalah pengidentifikasi unik yang universal. Ini merujuk ke sistem pengidentifikasi khusus yang dapat Anda gunakan. Bukan itu yang Anda lakukan di sini, jadi jangan gunakan istilah itu.
Winston Ewert
4
Saya hanya akan meninggalkan Anda dengan kisah Generator Kutukan Otomatis
Scott Chamberlain
1
@ HappyDeveloper, pertama, ini tidak universal. Ini khusus untuk aplikasi Anda. Kedua, uuid secara khusus merujuk pada en.wikipedia.org/wiki/Universally_unique_identifier bukan skema serupa yang Anda buat.
Winston Ewert
2
Ini merupakan pemborosan yang luar biasa. Peluangnya untuk benar-benar terjadi adalah terlalu kecil untuk dipertimbangkan bahkan untuk memikirkan ...
Michael Borgwardt

Jawaban:

6

Beberapa tips yang akan menurunkan kemungkinan secara tidak sengaja membuat kata-kata yang bermakna:

  • Tambahkan beberapa karakter non-alfa, non-numerik ke dalam campuran, seperti "-", "!" atau "_".
  • Buat UUID Anda dengan mengakumulasi urutan karakter (daripada karakter tunggal) yang tidak mungkin muncul dalam kata-kata nyata, seperti "zx" atau "aa".

Ini adalah beberapa kode sampel C # (menggunakan .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();  
}  

Ini tidak menjamin bahwa Anda tidak akan menyinggung siapa pun, tetapi saya setuju dengan @DeadMG bahwa Anda tidak dapat membidik dengan begitu tinggi.

CesarGon
sumber
1
masalah dengan non-alfanumerik adalah bahwa beberapa dari mereka tidak boleh bermain bagus di URI (menyebabkan karakter lolos, yang merupakan no-no besar di URL kecil: ada alasan dengan bit.ly dan tinyurl tidak menggunakannya). Masalah lainnya adalah bahwa mereka kurang intuitif untuk pengguna: mereka tidak mudah, katakanlah, tuliskan pada post-it atau mentransmisikannya di telepon (banyak non-teknisi tidak memiliki petunjuk apa nama garis bawah adalah, untuk contoh). Sekali lagi ada alasan mengapa url dan bit.ly kecil tidak menggunakannya.
user988052
@ user988052: Karenanya beberapa karakter non-alfa, non-numerik. Sangat mudah untuk memilih beberapa yang baik untuk URI dan cukup mudah bagi manusia.
CesarGon
"Karenanya beberapa karakter non-alfa, non-numerik." [sic] ... Layanan pemendekan URL (bit.ly, tinyurl, t.co, goo.gl, dll.) tampaknya berpikir bahwa nol non-alphanum lebih baik daripada "beberapa". Dan saya pikir alasan saya jelaskan di komentar saya sebelumnya adalah bagian dari penjelasan mengapa layanan ini tidak setuju dengan sudut pandang Anda. Sekarang jelas pendapat kami berbeda tentang masalah ini dan saya akan meninggalkan Anda kata terakhir; )
user988052
@ user988052: Saya telah menggunakan goo.gl sejak lama dan tidak pernah memiliki masalah dengan mengonversi semua jenis karakter non-alpha; satu-satunya pengecualian adalah%. Anda dapat menemukan ini didokumentasikan dalam grup diskusi layanan. Bisakah Anda memberikan referensi yang mendukung klaim Anda?
CesarGon
1
OP menyatakan dia ingin nama pendek dan meminta metode untuk menghasilkan ini. Anda menyarankan "menambahkan karakter non-alfa, non-numerik ke dalam campuran" [sic]. Jadi apa yang Anda sarankan? OP itu pertama-tama menghasilkan "sesuatu" dan kemudian mengirimkannya ke tinyurl / bit.ly? Saya pikir bukan itu yang diinginkan OP. OP ingin secara langsung menghasilkan URL yang relatif "kecil". Yang saya katakan adalah bahwa jika itu yang dia cari, maka mungkin lebih baik baginya untuk menggunakan alfabet alphanum, seperti yang dilakukan tinyurl / bit.ly! Sekarang saya benar-benar libur.
user988052
5

Cukup buat daftar kata nakal, daftar pengganti surat, dan kemudian jika ID apa pun yang dihasilkan adalah kata nakal, ulangi.

Misalnya (kode semu)

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))

(Anda dapat merujuk rekomendasi url pendek lainnya seperti ini untuk info tentang hashing / konversi basis 62)

Sekarang Anda tidak lagi mendapatkan ID suka a55, sh1tatau "b00bs". Daftar pengganti surat Anda hanya perlu memuat karakter dalam kata-kata nakal Anda, jelas.

Karena tidak ada yang akan membaca "455" sebagai "keledai" maka Anda mungkin juga ingin return strmasuk reducestringjika tidak mengandung huruf apa pun.

Contohnya

Situs desain grafis Dribbble memiliki id string pendeknya sendiri untuk posting. Ini menggunakan 0-9, az dan AZ seperti http://drbl.in/dCWi .

Saya melakukan beberapa percobaan dan ada id pendek untuk setidaknya beberapa kata nakal. Saya kira kita akan melihat kapan mereka sampai f, tetapi mereka belum ada di sana.

Memang - memberikan pengguna url ( /user/whatever) pengenal pribadi mereka sendiri, dan bukan hanya pos, jauh lebih buruk dengan kata-kata nakal.

Nicole
sumber
2
Saya pernah menulis sebuah program yang menghasilkan kata sandi untuk layanan online. Mereka acak, tetapi ada beberapa heuristik yang membuat mereka agak mudah diucapkan, sehingga mereka akan lebih mudah diingat. Dan heuristik ini mengarah pada kata-kata kotor. Solusinya seperti yang dijelaskan di sini: periksa substring vulgar, termasuk yang bisa diucapkan mirip dengan kata-kata vulgar (misalnya mencari FUC dan FUK) dan membuat ulang kata sandi. (Untuk cekikikan, program menulis kata sandi yang ditolak ke file terpisah.)
kindall
1
Dan bagaimana Anda akan menulis hal seperti itu untuk setiap bahasa ?
DeadMG
1
@DeadMG Untuk set lengkap dari semua kata ofensif yang mungkin, ini hanya dapat membuat set itu lebih kecil. Apakah sikap Anda benar-benar: "karena Anda tidak dapat mencapai 100%, itu secara otomatis tidak layak melakukan apa pun"?
Nicole
Bagaimana dengan UTF-8? Ada banyak karakter alternatif yang dapat dicetak yang mengatasi pergantian ini.
JBRWilkinson
1
@ JBRWilkinson yang tidak berlaku karena OP sedang mengatur rangkaian karakter karakter alfanumerik untuk ID, bukan?
Nicole
5

Pertimbangkan untuk menggunakan tombol angka atau heksadesimal sebagai gantinya. Ini akan menghemat banyak masalah dibandingkan dengan menulis filter senonoh yang sadar saya, dan yang terburuk yang harus Anda khawatirkan adalah daging sapi mati .

Komunitas
sumber
1
+1: Saya pikir ini adalah solusi paling sederhana dan teraman. Anda dapat membuat uuid dalam bentuk angka dan menggunakan representasi string untuk itu (desimal, heksadesimal, oktal).
Giorgio
4
Anda masih harus khawatir tentang B16B00B5: P
CodesInChaos
3

Anda tidak pernah dapat mencegah sistem otomatis menghasilkan beberapa string yang menyinggung pengguna. Misalnya, di Cina beberapa nomor dianggap tidak beruntung.

Yang bisa Anda lakukan adalah memberi tahu pengguna bahwa ID mereka acak dan isinya tidak relevan dan jika mereka mendapatkannya /user/fuckermereka harus mengabaikannya. Hal-hal ini terjadi dan itu tidak layak secara teknis untuk menghindarinya - sama seperti Anda tidak pernah dapat menyaring kata-kata kotor.

DeadMG
sumber
9
Saya bukan downvoter, tetapi saya merasa sangat kuat bahwa untuk kata-kata ofensif Anda benar-benar perlu melakukan jauh, jauh, jauh lebih baik daripada "memberi tahu mereka mereka harus mengabaikannya". Paling tidak yang bisa Anda lakukan adalah menawarkan beberapa cara untuk mengubah id yang dihasilkan menjadi yang mereka anggap dapat diterima.
Marjan Venema
4
Saya bukan downvoter juga, tapi saya setuju dengan @MarjanVenema, / user / f * cker tidak dapat diterima
HappyDeveloper
@ HappyDeveloper: Seperti yang saya sarankan sebelumnya, apa yang akan Anda lakukan? Anda tidak dapat mencegah pengguna diberi ID yang dianggap ofensif.
DeadMG
3
@DeadMG Anda dapat membantu situasi dengan mencegah beberapa kasus yang biasanya menyinggung . Saya pikir pertanyaan awal membuatnya cukup jelas.
Nicole
2
@NickC: Satu-satunya contoh umumnya ofensif dalam bahasa Inggris . Apakah Anda tahu apa yang biasanya ofensif dalam bahasa Arab, Portugis, Cina, Rusia? Belum lagi fakta bahwa bahasa-bahasa itu mungkin memiliki kata-kata kasar yang mengambil banyak, banyak bentuk. Sangat mudah untuk membedakan bentuk kata-kata yang jelas dari bahasa Inggris, tetapi tidak begitu mudah untuk melakukannya untuk semua orang.
DeadMG
2

Pada dasarnya ada dua strategi yang dapat Anda terapkan:

  1. Buat sistem yang tidak akan menghasilkan string ofensif. Misalnya, Anda dapat membuat id hanya dari huruf konsonan. Dengan meninggalkan semua vokal, Anda dapat yakin bahwa sistem Anda tidak akan pernah menghasilkan kata-kata bahasa Inggris, nakal atau sebaliknya.

  2. Setelah membuat id yang benar-benar acak, periksa untuk memastikan bahwa id baru tidak menyertakan substring yang menyinggung.

Caleb
sumber
1

Dalam banyak situasi (spam email, pemblokiran ip, dll), daftar hitam adalah permainan yang kalah - Anda tidak akan pernah bisa membuat daftar hitam "lengkap" dari setiap hal buruk yang mungkin terjadi. a b c d e f

Banyak orang menggunakan daftar putih kata-kata yang dapat diterima dan merangkai mereka dalam urutan acak. (Mungkin dengan tanda hubung atau titik atau spasi di antara setiap kata).

Beberapa kamus populer yang digunakan untuk mengonversi angka arbitrer menjadi serangkaian kata yang dapat diucapkan termasuk:

David Cary
sumber
0

Anda bisa membuatnya hanya angka yang dibuat secara acak, atau meminta regex untuk membatalkan yang ofensif:

/ass/ =~ userid
/boobs/ =~ userid
/morenaughtywordshere/ =~ userid
Billjk
sumber
2
Lucu, karena aku tidak pernah menganggap salah satu dari itu sebagai ofensif.
DeadMG
Saya tahu ... Itu hanya subjek yang sensitif untuk memposting kata-kata kutukan nyata di situs SE: meta.stackexchange.com/questions/22232/…
Billjk