จะสร้าง UUID ที่“ ปลอดภัยต่อภาษา” ได้อย่างไร


20

ฉันต้องการใช้สตริงที่สร้างขึ้นแบบสุ่มสำหรับ ID ทรัพยากรของฉันดังนั้นฉันอาจมี URL ที่สั้นกว่านี้: / user / 4jz0k1

แต่ฉันไม่เคยทำเพราะฉันกังวลเกี่ยวกับการสร้างสตริงแบบสุ่มที่สร้างคำที่แท้จริงเช่น: / user / f * cker สิ่งนี้ทำให้เกิดปัญหาสองประการ: อาจทำให้ผู้ใช้สับสนหรืออาจทำให้เกิดความไม่พอใจและอาจทำให้เกิดปัญหากับ SEO ได้เช่นกัน

จากนั้นฉันคิดว่าสิ่งที่ฉันต้องทำคือตั้งค่ารูปแบบคงที่เช่นเพิ่มตัวเลขทุกตัวอักษร 2 ตัว ฉันมีความสุขมากกับวิธี 'generate_safe_uuid' ของฉัน แต่แล้วฉันก็รู้ว่ามันดีกว่าสำหรับ SEO และแย่กว่าสำหรับผู้ใช้เพราะมันเพิ่มอัตราส่วนของคำที่สร้างขึ้นจริงเช่น: / user / g4yd1ck5

ตอนนี้ฉันคิดว่าฉันสามารถสร้างวิธีการ 'replace_numbers_with_letters' และตรวจสอบว่ามันไม่ได้สร้างคำใด ๆ กับพจนานุกรมหรืออะไรบางอย่าง

ความคิดอื่น ๆ ?

PS เมื่อฉันเขียนสิ่งนี้ฉันก็ตระหนักว่าการตรวจสอบคำในภาษามากกว่าหนึ่งภาษา (เช่น: อังกฤษและฝรั่งเศส, สเปน, ฯลฯ ) จะเป็นเรื่องยุ่งเหยิงและฉันก็เริ่มหลงรัก ID ที่เป็นตัวเลขเท่านั้นอีกครั้ง

UPDATE

ลิงก์บางอย่างที่ทุกคนควรอ่าน:

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

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


ใช้แฮชหรือเช็คซัมหรือไม่? หากคุณต้องการใช้สตริงแบบสุ่มไม่มีกฎใดที่คุณต้องใช้ตัวอักษรทุกตัวในตัวอักษร
Austin Henley

21
อย่าเรียกว่า uuid uuid เป็นตัวระบุที่เป็นสากล มันหมายถึงระบบเฉพาะของตัวระบุที่คุณสามารถใช้ นั่นไม่ใช่สิ่งที่คุณกำลังทำอยู่ที่นี่ดังนั้นอย่าใช้คำนั้น
Winston Ewert

4
ฉันจะทิ้งคุณไว้กับเรื่องราวของเครื่องกำเนิดคำสาปอัตโนมัติ
Scott Chamberlain

1
@ HappyDeveloper ประการแรกมันไม่สากล มันเป็นสิ่งที่เฉพาะเจาะจงกับแอปพลิเคชันของคุณ ประการที่สอง uuid อ้างถึงen.wikipedia.org/wiki/Universally_unique_identifierโดยเฉพาะไม่ใช่รูปแบบที่คล้ายกันที่คุณกำหนด
Winston Ewert

2
นี่เป็นเรื่องไร้สาระที่น่าเหลือเชื่ออย่างยิ่ง โอกาสที่จะเกิดขึ้นจริงเป็นวิธีที่เล็กเกินไปที่จะคุ้มค่าแม้แต่คิด ...
Michael Borgwardt

คำตอบ:


6

เคล็ดลับสองข้อที่จะลดโอกาสในการสร้างคำที่มีความหมายโดยไม่ตั้งใจ:

  • เพิ่มอักขระที่ไม่ใช่ตัวอักษรและไม่ใช่ตัวเลขบางตัวลงในมิกซ์เช่น "-", "!" หรือ "_".
  • เขียน UUID ของคุณด้วยการสะสมลำดับของอักขระ (แทนที่จะเป็นอักขระเดียว) ที่ไม่น่าจะเกิดขึ้นในคำจริงเช่น "zx" หรือ "aa"

นี่คือโค้ดตัวอย่าง 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
ปัญหาที่ไม่ใช่ตัวอักษรและตัวเลขคือบางส่วนของพวกเขาจะไม่เล่นที่ดีใน URIs (นำไปสู่การหลบหนีตัวละครซึ่งเป็นขนาดใหญ่ที่ไม่มีใน URL เล็ก ๆ : มีเหตุผล bit.ly และ tinyurl ไม่ได้ใช้พวกเขา) อีกประเด็นคือผู้ใช้ไม่เข้าใจง่าย: พูดง่ายเขียนลงบนโพสต์หรือส่งทางโทรศัพท์ (ผู้ที่ไม่ได้ใช้เทคโนโลยีจำนวนมากไม่มีเงื่อนงำว่าชื่อขีดล่างคืออะไรสำหรับ ตัวอย่าง). อีกครั้งมีเหตุผลทำไม URL เล็ก ๆ และ bit.ly ไม่ได้ใช้พวกเขา
user988052

@ user988052: อักขระบางตัวที่ไม่ใช่ตัวอักษรและไม่ใช่ตัวเลข มันง่ายที่จะเลือกบางอย่างที่ดีสำหรับ URIs และง่ายพอสำหรับมนุษย์
CesarGon

"ดังนั้นอักขระบางตัวที่ไม่ใช่ตัวอักษรและไม่ใช่ตัวเลข" [sic] ... บริการย่อ URL (bit.ly, tinyurl, t.co, goo.gl ฯลฯ ) ดูเหมือนจะคิดว่าศูนย์ที่ไม่ใช่ตัวอักษรตัวอักษรนั้นดีกว่า "บางส่วน" และฉันคิดว่าเหตุผลที่ฉันอธิบายในความคิดเห็นก่อนหน้าของฉันเป็นส่วนหนึ่งของคำอธิบายว่าทำไมบริการเหล่านี้ไม่เห็นด้วยกับมุมมองของคุณ ตอนนี้เห็นได้ชัดว่าความคิดเห็นของเรามีความแตกต่างในเรื่องและฉันจะทิ้งคุณคำสุดท้าย; )
user988052

@ user988052: ฉันใช้ goo.gl มานานแล้วและไม่เคยมีปัญหากับการแปลงอักขระที่ไม่ใช่อัลฟาทุกประเภท ข้อยกเว้นเพียงอย่างเดียวคือ% คุณสามารถค้นหาเอกสารนี้ได้ในกลุ่มสนทนาของบริการ คุณสามารถให้การอ้างอิงใด ๆ ที่สำรองการอ้างสิทธิ์ของคุณได้หรือไม่?
CesarGon

1
OP ระบุว่าเขาต้องการชื่อสั้น ๆ และขอวิธีในการสร้างสิ่งเหล่านี้ คุณแนะนำ"เพิ่มลูกชายที่ไม่ใช่ตัวอักษรและไม่ใช่ตัวเลขในการผสม" [sic] ดังนั้นคุณจะแนะนำอะไร OP นั้นสร้าง "บางอย่าง" ก่อนจากนั้นส่งสิ่งนี้ไปยัง tinyurl / bit.ly ฉันคิดว่านั่นไม่ใช่สิ่งที่ OP ทำหลังจากนั้น OP ต้องการโดยตรงสร้าง URL ที่ค่อนข้าง "เล็ก ๆ" ซึ่งเป็น ทั้งหมดที่ฉันพูดคือถ้านั่นคือสิ่งที่เขาหลังจากนั้นมันอาจจะดีกว่าสำหรับเขาที่จะใช้ตัวอักษรอัลฟานัมเช่นเดียวกับ tinyurl / bit.ly กำลังทำ! ตอนนี้ฉันเลิกแล้วจริงๆ
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))

(คุณสามารถอ้างอิงคำแนะนำ URL แบบสั้นอื่น ๆ เช่นนี้เพื่อรับทราบข้อมูลเกี่ยวกับฐานแฮช / การแปลง 62)

ตอนนี้คุณไม่ได้รับรหัสชอบa55, sh1tหรือ "b00bs" รายการทดแทนตัวอักษรของคุณจะต้องมีอักขระในคำพูดซนของคุณเท่านั้น

เนื่องจากไม่มีใครจะไปอ่าน "455" เป็น "ลา" แล้วคุณอาจต้องการที่จะreturn strอยู่ในreducestringถ้ามันไม่ได้มีตัวอักษรใด ๆ

ตัวอย่าง

ไซต์Dribbbleออกแบบกราฟิกมีรหัสสตริงสั้น ๆ ของตัวเองสำหรับการโพสต์ การใช้งานเหล่านี้ 0-9, az และ AZ เช่นhttp://drbl.in/dCWi

ฉันทำการทดลองและมีรหัสสั้น ๆ เป็นเวลาอย่างน้อยสองสามคำที่ซุกซน ฉันเดาว่าเราจะเห็นเมื่อพวกเขาไปถึงfแต่พวกเขายังไม่ได้อยู่ที่นั่น

ได้รับ - ให้ผู้ใช้ระบุ url ( /user/whatever) ของตนเองแทนการโพสต์นั้นแย่กว่ามากด้วยคำหยาบคาย


2
ฉันเคยเขียนโปรแกรมที่สร้างรหัสผ่านสำหรับบริการออนไลน์ พวกมันสุ่ม แต่มีฮิวริสติกสองสามตัวที่ทำให้พวกมันออกเสียงได้อย่างชัดเจนดังนั้นพวกเขาจะจำได้ง่ายขึ้น และฮิวริสติกเหล่านี้นำไปสู่การดูหมิ่น วิธีแก้ปัญหาดังที่อธิบายไว้ที่นี่: ตรวจสอบ substrings ที่หยาบคายรวมถึงที่สามารถออกเสียงคล้ายกับคำหยาบคาย (เช่นมองหา FUC และ FUK) และสร้างรหัสผ่านใหม่ (สำหรับหัวเราะคิกคักโปรแกรมเขียนรหัสผ่านที่ถูกปฏิเสธไปยังไฟล์แยกต่างหาก)
kindall

1
แล้วคุณจะเขียนเรื่องนี้ในทุก ๆ ภาษาบนโลกอย่างไร
DeadMG

1
@DeadMG สำหรับชุดคำที่ไม่เหมาะสมทั้งหมดอาจทำให้ชุดนั้นเล็กลงได้ ท่าทางของคุณเป็นจริง: "เพราะคุณไม่สามารถเข้าถึง 100% มันไม่คุ้มที่จะทำอะไรโดยอัตโนมัติ"?
Nicole

แล้ว UTF-8 ล่ะ? มีตัวอักษรที่พิมพ์ได้จำนวนมากที่สามารถหลีกเลี่ยงการทดแทนนี้ได้
JBRWilkinson

1
@JBRWilkinson ที่ไม่สามารถใช้งานได้เนื่องจาก OP กำลังตั้งค่าชุดอักขระของตัวอักษรและตัวเลขสำหรับรหัสใช่มั้ย
นิโคล

5

ลองใช้คีย์ตัวเลขหรือเลขฐานสิบหกแทน มันจะช่วยให้คุณประหยัดมากปัญหาเมื่อเทียบกับการเขียนตัวกรองคำหยาบคาย i18n ทราบและที่เลวร้ายที่สุดที่คุณจะต้องกังวลเกี่ยวกับการเป็นเนื้อวัวที่ตายแล้ว


1
+1: ฉันคิดว่านี่เป็นวิธีที่ง่ายและปลอดภัยที่สุด คุณสามารถสร้าง uuid ในรูปแบบของตัวเลขและใช้การแทนสตริง (ทศนิยมฐานสิบหกฐานแปด)
Giorgio

4
คุณยังต้องกังวลเกี่ยวกับB16B00B5: P
CodesInChaos

3

คุณไม่สามารถป้องกันระบบอัตโนมัติจากการสร้างสตริงที่ไม่เหมาะสมสำหรับผู้ใช้ ตัวอย่างเช่นในประเทศจีนตัวเลขบางอย่างถือว่าโชคร้าย

สิ่งที่คุณทำได้จริงๆคือบอกผู้ใช้ว่า ID ของพวกเขาเป็นแบบสุ่มและเนื้อหาไม่เกี่ยวข้องและหากพวกเขาได้รับ/user/fuckerพวกเขาก็ควรเพิกเฉย สิ่งเหล่านี้เกิดขึ้นและเป็นไปไม่ได้ในทางเทคนิคที่จะหลีกเลี่ยงได้ - เหมือนกับที่คุณไม่สามารถกรองคำหยาบคาย


9
ฉันไม่ได้เป็นผู้ลงคะแนนเสียง แต่ฉันรู้สึกอย่างแรงกล้าว่าสำหรับคำที่ไม่เหมาะสมคุณจำเป็นต้องทำมากยิ่งกว่าดีกว่า "บอกพวกเขาว่าพวกเขาควรเพิกเฉย" อย่างน้อยที่สุดที่คุณสามารถทำได้คือเสนอวิธีการเปลี่ยน id ที่สร้างขึ้นให้เป็นรหัสที่พวกเขาพบว่ายอมรับได้
Marjan Venema

4
ฉันไม่ใช่ downvoter เช่นกัน แต่ฉันเห็นด้วยกับ @MarjanVenema, / user / f * cker ไม่เป็นที่ยอมรับ
HappyDeveloper

@HappyDeveloper: ตามที่ฉันแนะนำไปก่อนหน้านี้คุณจะทำอะไรกับเรื่องนี้? คุณไม่สามารถป้องกันผู้ใช้จากการได้รับ ID ที่พวกเขาพบว่าไม่เหมาะสม
DeadMG

3
@DeadMG คุณสามารถช่วยสถานการณ์โดยการป้องกันกรณีที่น่ารังเกียจ ฉันคิดว่าคำถามเดิมทำให้ชัดเจน
นิโคล

2
@NickC: ตัวอย่างเพียง แต่เป็นที่น่ารังเกียจกันทั่วไปในภาษาอังกฤษ คุณมีความคิดใด ๆ ที่น่ารังเกียจในภาษาอาหรับโปรตุเกสจีนรัสเซียหรือไม่? ไม่ต้องพูดถึงความจริงที่ว่าภาษาเหล่านั้นอาจมีคำสาบานที่มีหลายรูปแบบ มันง่ายที่จะเป็นกรณีพิเศษรูปแบบที่ชัดเจนของคำจากภาษาอังกฤษ แต่ไม่ใช่เรื่องง่ายที่จะทำเพื่อทุกคน
DeadMG

2

มีสองกลยุทธ์หลักที่คุณสามารถใช้:

  1. สร้างระบบที่จะไม่สร้างสตริงที่ไม่เหมาะสม ตัวอย่างเช่นคุณสามารถเขียน id ของคุณได้จากตัวอักษรพยัญชนะ คุณสามารถมั่นใจได้ว่าระบบของคุณจะไม่สร้างคำภาษาอังกฤษซนหรืออื่นใด

  2. หลังจากสร้างรหัสสุ่มสมบูรณ์แล้วให้ตรวจสอบเพื่อให้แน่ใจว่ารหัสใหม่นั้นไม่มีสตริงย่อยที่ไม่เหมาะสม


1

ในหลาย ๆ สถานการณ์ (อีเมลขยะการบล็อกไอพีและอื่น ๆ ) บัญชีดำเป็นเกมที่แพ้ - คุณจะไม่สามารถทำบัญชีดำ "สมบูรณ์" ของสิ่งเลวร้ายที่อาจเกิดขึ้นได้ a b c d e f

หลายคนใช้บัญชีขาวของคำศัพท์ที่ยอมรับได้และรวมเข้าด้วยกันตามลำดับแบบสุ่ม (อาจมีเส้นประหรือจุดหรือช่องว่างระหว่างแต่ละคำ)

พจนานุกรมยอดนิยมบางคำที่ใช้สำหรับแปลงตัวเลขให้เป็นคำที่ออกเสียงประกอบด้วย:


0

คุณสามารถทำให้มันเป็นเพียงตัวเลขที่สร้างแบบสุ่มหรือมี regex เพื่อยกเลิกตัวเลขที่ไม่เหมาะสม:

/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.