"भाषा-सुरक्षित" UUIDs कैसे जनरेट करें?


20

मैं हमेशा अपने संसाधनों की आईडी के लिए बेतरतीब ढंग से उत्पन्न तारों का उपयोग करना चाहता था, इसलिए मेरे पास इस तरह के छोटे यूआरएल हो सकते हैं: / उपयोगकर्ता / 4jz0k1

लेकिन मैंने कभी नहीं किया, क्योंकि मैं यादृच्छिक स्ट्रिंग पीढ़ी के बारे में चिंतित था जो वास्तविक शब्द बनाते थे, जैसे: / उपयोगकर्ता / f * cker। यह दो समस्याएं लाता है: यह उपयोगकर्ताओं के लिए भ्रमित या आक्रामक हो सकता है, और यह एसईओ के साथ भी गड़बड़ कर सकता है।

फिर मैंने सोचा कि मुझे जो कुछ करना था वह एक निश्चित पैटर्न सेट करना था जैसे कि हर 2 अक्षरों में एक संख्या जोड़ना। मैं अपने 'जनरेट_सैफ़_यूआईडी' पद्धति से बहुत खुश था, लेकिन तब मुझे एहसास हुआ कि यह केवल एसईओ के लिए बेहतर था, और उपयोगकर्ताओं के लिए बदतर है, क्योंकि इससे उत्पन्न होने वाले वास्तविक शब्दों का अनुपात बढ़ गया है, जैसे: / उपयोगकर्ता / g4yd1ck5

अब मैं सोच रहा हूं कि मैं एक विधि 'replace_numbers_with_letters' बना सकता हूं, और जांच कर सकता हूं कि इसने किसी शब्द या शब्द के खिलाफ कोई शब्द नहीं बनाया है।

कोई अन्य विचार?

ps। जैसा कि मैंने इसे लिखा है, मैंने यह भी महसूस किया कि एक से अधिक भाषाओं में शब्दों की जाँच करना (जैसे: अंग्रेजी और फ्रेंच, स्पेनिश, इत्यादि) एक गड़बड़ होगी, और मैं नंबर-केवल आईडी को फिर से प्यार करना शुरू कर रहा हूं।

अपडेट करें

कुछ लिंक हर किसी को पढ़ने चाहिए:

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

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


एक हैश या चेकसम का उपयोग करें? यदि आप एक यादृच्छिक स्ट्रिंग का उपयोग करना पसंद करते हैं, तो कोई नियम नहीं है कि आपको वर्णमाला के प्रत्येक अक्षर का उपयोग करना है।
ऑस्टिन हेनले

21
इसे यूआईडी न कहें, यूआईडी सार्वभौमिक रूप से विशिष्ट पहचानकर्ता हैं। इसका तात्पर्य पहचानकर्ताओं की एक विशिष्ट प्रणाली से है जिसे आप उपयोग कर सकते हैं। आप यहाँ क्या कर रहे हैं, इसलिए उस शब्द का उपयोग न करें।
विंस्टन एवर्ट

4
मैं सिर्फ
स्कॉट चैंबरलेन

1
@ HappyDeveloper, सबसे पहले, यह सार्वभौमिक नहीं है। यह आपके एप्लिकेशन के लिए विशिष्ट है। दूसरे, uuid विशेष रूप से en.wikipedia.org/wiki/Universally_unique_identifier को संदर्भित करता है ऐसी कोई भी योजना नहीं जो आप वसीयत करते हैं।
विंस्टन इवर्ट

2
यह ब्रेनटाइम की ऐसी अविश्वसनीय बर्बादी है। यह वास्तव में हो रहा है की संभावना के बारे में भी सोचने लायक होने के लिए बहुत छोटा रास्ता है ...
माइकल Borgwardt

जवाबों:


6

अनजाने में सार्थक शब्द बनाने की संभावनाओं को कम करने वाले सुझावों की एक जोड़ी:

  • मिश्रण में कुछ गैर-अल्फा, गैर-संख्यात्मक अक्षर जोड़ें, जैसे "-", "!" या "_"।
  • अपने UUIDs को ऐसे (zx) या "आ" जैसे वास्तविक शब्दों में होने की संभावना वाले (एकल वर्णों के बजाय) वर्णों के अनुक्रमों को जमा करके लिखें।

यह कुछ 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
गैर-अल्फ़ान्यूमेरिक के साथ समस्या यह है कि उनमें से कुछ यूआरआई में अच्छा नहीं खेलेंगे (अग्रणी चरित्र के लिए अग्रणी, जो एक छोटे URL में एक बड़ी संख्या में नहीं हैं: bit.ly के साथ एक कारण है और टिनीर्ल उनका उपयोग नहीं कर रहे हैं)। दूसरा मुद्दा यह है कि वे उपयोगकर्ता के लिए कम सहज हैं: वे आसान नहीं हैं, कहते हैं, पोस्ट-इट पर लिखें या फोन पर संचारित करें (कई गैर-तकनीकी लोगों का कोई सुराग नहीं है कि अंडरस्कोर का नाम क्या है, क्योंकि उदाहरण)। एक बार फिर से छोटे url और bit.ly का उपयोग न करने का एक कारण है।
user988052

@ user988052: इसलिए कुछ गैर-अल्फा, गैर-संख्यात्मक वर्ण। यूआरआई के लिए ठीक है और मनुष्यों के लिए काफी आसान है।
सेसरगॉन

"इसलिए कुछ गैर-अल्फा, गैर-संख्यात्मक चरित्र।" [sic] ... URL सेवाओं को छोटा करना (bit.ly, tinyurl, t.co, goo.gl, आदि) लगता है कि शून्य गैर-अल्फ़ान्यूम "कुछ" से बेहतर है। और मुझे लगता है कि मैंने अपनी पिछली टिप्पणियों में जिन कारणों के बारे में बताया, वे इस स्पष्टीकरण का हिस्सा हैं कि ये सेवाएं आपके दृष्टिकोण से सहमत क्यों नहीं हैं। अब जाहिर है कि इस मामले पर हमारी राय अलग है और मैं आपको अंतिम शब्द छोड़ दूंगा; )
user988052

@ user988052: मैं उम्र के लिए goo.gl का उपयोग कर रहा हूं और इसमें कभी भी सभी प्रकार के गैर-अल्फा वर्णों को परिवर्तित करने का मुद्दा नहीं था; एकमात्र अपवाद% रहा। आप इस दस्तावेज़ को सेवा के चर्चा समूह में पा सकते हैं। क्या आप कोई भी संदर्भ प्रदान कर सकते हैं जो आपके दावों का समर्थन करता है?
सीजरगॉन

1
ओपी ने कहा कि वह संक्षिप्त नाम चाहते थे और इन्हें उत्पन्न करने के लिए एक विधि की मांग करते हैं। आप सुझाव देते हैं कि "बेटे को गैर-अल्फ़ा, गैर-संख्यात्मक वर्णों को मिश्रण में जोड़ना" [sic]। तो आप क्या सुझाव दे रहे हैं? वह ओपी पहले "कुछ" उत्पन्न करता है और फिर इसे टुनर्ल / बिट.ली को भेजता है? मुझे लगता है कि ओपी के बाद ऐसा नहीं है। ओपी सीधे एक यूआरएल उत्पन्न करना चाहता है जो अपेक्षाकृत "छोटे" हो। मैं बस इतना ही कह रहा हूं कि अगर वह उसके बाद है, तो उसके लिए अल्फ़ान्यूम वर्णमाला का उपयोग करना बेहतर हो सकता है, जैसे कि छोटेलाल / बिट.ली कर रही है! अब मैं वास्तव में बंद हूँ।
user988052

5

बस एक शरारती शब्द सूची, एक पत्र प्रतिस्थापन सूची बनाएं, और फिर यदि कोई आईडी उत्पन्न होती है तो वह एक शरारती शब्द है, इसे फिर से करें।

उदाहरण के लिए (छद्म कोड)

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 हैशिंग / रूपांतरण की जानकारी के लिए इस तरह की अन्य छोटी यूआरएल सिफारिशों का उल्लेख कर सकते हैं )

अब आप नहीं रह गया है आईडी की तरह मिलता है a55, sh1tया "b00bs"। आपकी पत्र प्रतिस्थापन सूची में केवल आपके शरारती शब्दों में ही वर्णों को शामिल करने की आवश्यकता होगी।

के बाद से कोई भी रूप में "गधा" "455" को पढ़ने के लिए जा रहा है तो आप भी कर सकते हैं return strमें reducestringअगर यह किसी भी अक्षर नहीं है।

उदाहरण

ग्राफिक-डिज़ाइन साइट ड्रिबल के पास पदों के लिए अपनी छोटी स्ट्रिंग आईडी है। ये http://drbl.in/dCWi जैसे 0-9, az और AZ का उपयोग करते हैं ।

मैंने कुछ प्रयोग किए और कम से कम कुछ शरारती शब्दों के लिए संक्षिप्त आईडी हैं। मुझे लगता है कि जब हम मिलेंगे तब देखेंगे f, लेकिन वे अभी तक वहां नहीं हैं।

दी गई - एक उपयोगकर्ता /user/whateverको केवल एक पोस्ट के बजाय व्यक्तिगत रूप से पहचानने वाले url ( ) देने से शरारती शब्दों के साथ बहुत बुरा होता है।


2
मैंने एक बार एक कार्यक्रम लिखा था जो एक ऑनलाइन सेवा के लिए पासवर्ड उत्पन्न करता था। वे यादृच्छिक थे, लेकिन कुछ अनुमान थे जो उन्हें क्रमबद्ध उच्चारण करते थे, इसलिए उन्हें अधिक आसानी से याद किया जाएगा। और इन उत्तराधिकारियों ने अपवित्रता का नेतृत्व किया। इसका समाधान यहां बताया गया है: अशिष्ट पदार्थों के लिए जाँच करें, जिनमें वे भी शामिल हैं जिनका वल्गर शब्दों के समान उच्चारण किया जा सकता है (जैसे FUC और FUK के लिए देखें) और पासवर्ड को पुन: बनाएँ। (गिगल्स के लिए, प्रोग्राम ने अस्वीकृत पासवर्ड को एक अलग फाइल में लिखा है।)
टाइप करें

1
और पृथ्वी पर आप हर भाषा के लिए ऐसा कैसे लिखने जा रहे हैं ?
डेडएमजी

1
@DeadMG सभी संभव आक्रामक शब्दों के पूर्ण सेट के लिए, यह केवल उस सेट को छोटा बना सकता है। क्या आपका रुख वास्तव में है: "क्योंकि आप 100% तक नहीं पहुंच सकते हैं, यह स्वचालित रूप से कुछ भी करने के लायक नहीं है"?
निकोल

UTF-8 के बारे में क्या? इस प्रतिस्थापन के आसपास मिलने वाले बहुत सारे वैकल्पिक मुद्रण योग्य चार्ट हैं।
JBRWilkinson

1
@JBRWilkinson जो लागू नहीं होता है क्योंकि ओपी आईडी के लिए अल्फ़ान्यूमेरिक वर्णों के वर्ण सेट को सही कर रहा है?
निकोल

5

इसके बजाय एक संख्यात्मक या हेक्साडेसिमल कुंजी का उपयोग करने पर विचार करें। यह एक i18n जागरूक अपवित्रता फिल्टर लिखने की तुलना में आपको बहुत परेशानी से बचाएगा, और सबसे बुरी बात आपको मृत गोमांस के बारे में चिंता करनी होगी ।


1
+1: मुझे लगता है कि यह सबसे सरल और सुरक्षित उपाय है। आप एक संख्या के रूप में एक यूयूआईडी उत्पन्न कर सकते हैं और इसके लिए एक स्ट्रिंग प्रतिनिधित्व का उपयोग कर सकते हैं (दशमलव, हेक्साडेसिमल, ऑक्टल)।
जियोर्जियो

4
आपको अभी भी चिंता करने की ज़रूरत है B16B00B5: P
CodesInChaos

3

आप कभी भी एक उपयोगकर्ता के लिए आक्रामक है कि कुछ स्ट्रिंग पैदा करने से एक स्वचालित प्रणाली को रोक नहीं सकते। उदाहरण के लिए, चीन में कुछ संख्याओं को अशुभ माना जाता है।

आप सभी वास्तव में उपयोगकर्ता को बता सकते हैं कि उनकी आईडी यादृच्छिक है और सामग्री अप्रासंगिक हैं और यदि वे मिलते हैं /user/fuckerतो उन्हें बस इसे अनदेखा करना चाहिए। ये चीजें होती हैं और इससे बचने के लिए सिर्फ तकनीकी रूप से संभव नहीं है- ठीक वैसे ही जैसे आप कभी अपवित्रता को फ़िल्टर नहीं कर सकते।


9
मैं नीच नहीं हूं, लेकिन मैं बहुत दृढ़ता से महसूस करता हूं कि आपत्तिजनक शब्दों के लिए आपको वास्तव में बहुत कुछ करने की ज़रूरत है, "इससे बेहतर है कि उन्हें बताएं कि उन्हें इसे अनदेखा करना चाहिए"। कम से कम आप ऐसा कर सकते हैं कि जनरेट की गई आईडी को बदलने के लिए किसी तरह की पेशकश करें जो उन्हें स्वीकार्य लगे।
मार्जन वेनमा

4
मैं या तो नीच नहीं हूं, लेकिन मैं @MarjanVenema, / user / f * cker से सहमत नहीं
हूं

@HappyDeveloper: जैसा कि मैंने पहले सुझाव दिया था, आप इसके बारे में क्या करने जा रहे हैं? आप उपयोगकर्ताओं को आईडी दिए जाने से रोक नहीं सकते हैं जो उन्हें अपमानजनक लगता है।
डेडएमजी

3
@ डीडीएमजी आप कुछ सामान्य रूप से आक्रामक मामलों को रोककर स्थिति की मदद कर सकते हैं । मुझे लगा कि मूल प्रश्न ने बहुत स्पष्ट कर दिया है।
निकोल

2
@NickC: केवल उदाहरण आमतौर पर अंग्रेजी में आक्रामक होते हैं । क्या आपके पास कोई विचार है जो आमतौर पर अरबी, पुर्तगाली, चीनी, रूसी में आक्रामक है? इस तथ्य का उल्लेख नहीं करने के लिए कि उन भाषाओं में शपथ-पत्र हो सकते हैं जो कई, कई रूप लेते हैं। अंग्रेजी से शब्दों के स्पष्ट रूपों को विशेष-मामला करना आसान है, लेकिन हर किसी के लिए ऐसा करना आसान नहीं है।
डेडएमजी

2

अनिवार्य रूप से दो रणनीतियाँ हैं जिन्हें आप नियोजित कर सकते हैं:

  1. एक ऐसी प्रणाली बनाएं जो किसी भी आक्रामक तार को उत्पन्न नहीं करेगी। उदाहरण के लिए, आप अपनी आईडी केवल व्यंजन अक्षरों से बना सकते हैं। सभी स्वरों को छोड़कर, आप यह सुनिश्चित कर सकते हैं कि आपका सिस्टम कभी भी अंग्रेजी शब्द, शरारती या अन्यथा उत्पन्न नहीं करेगा।

  2. पूरी तरह से रैंडम आईडी जनरेट करने के बाद, सुनिश्चित करें कि नई आईडी में कोई आपत्तिजनक सबस्ट्रिंग शामिल नहीं है।


1

कई स्थितियों में (ईमेल स्पैम, आईपी ब्लॉकिंग आदि), एक ब्लैकलिस्ट एक हारने वाला खेल है - आप कभी भी होने वाली हर संभव बुरी चीज़ का "पूर्ण" ब्लैकलिस्ट नहीं कर पाएंगे। बी सी डी एफ

बहुत से लोग स्वीकार्य शब्दों के श्वेतसूची का उपयोग करते हैं और उन्हें कुछ यादृच्छिक क्रम में एक साथ जोड़ते हैं। (शायद प्रत्येक शब्द के बीच डैश या डॉट या स्पेस के साथ)।

कुछ लोकप्रिय शब्दकोषों का उपयोग मनमाने ढंग से संख्याओं को शब्दों के उच्चारण की श्रृंखला में बदलने के लिए किया जाता है:


0

आप या तो इसे केवल बेतरतीब ढंग से उत्पन्न संख्याएँ बना सकते हैं, या उन लोगों को रद्द करने के लिए एक rexx है जो आक्रामक हैं:

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

2
मज़ेदार, क्योंकि मैं उन दोनों के बारे में कभी भी आक्रामक नहीं सोचता।
डेडजैम

मुझे पता है ... यह एक एसई साइट पर असली अभिशाप शब्दों को पोस्ट करने के लिए सिर्फ एक भावुक विषय है: meta.stackexchange.com/questions/22232/…
Billjk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.