रूबी में गाइड उत्पन्न करना


142

मुझे ऐसी समस्या है जो वास्तव में आसानी से गाईड के साथ हल हो गई है।

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

मैंने देखा कि रूबी के लिए एक गाइड मणि है; लेकिन यह काफी पुराना लग रहा है, और यह फाइल सिस्टम में सामान लिखता है।

क्या कोई किसी अन्य रत्न के बारे में जानता है जो विश्व स्तर पर अद्वितीय पहचानकर्ता बना सकता है?

मुझे पता है कि मैं अभी वापस आ सकता हूं:

(0..16).to_a.map{|a| rand(16).to_s(16)}.join 

लेकिन यह वास्तव में एक उचित GUID की तरह नहीं लगता है ...


1
इस तरह एक यादृच्छिक स्ट्रिंग का उपयोग करना काफी सही नहीं होगा; UUID में कुछ बिट संस्करण और संस्करण निर्दिष्ट करते हैं। एक यादृच्छिक यूयूआईडी के लिए, आप शायद वेरिएंट 2 (आरएफसी 4122) और संस्करण 4 चाहते हैं, इस स्थिति में 6 निश्चित बिट्स को सही मानों पर सेट किया जाना चाहिए।
jtpereyda

1
हां @dafrazzman सही है। बेतरतीब ढंग से एक साथ कुछ ऐसा करना जो "यूयूआईडी जैसा दिखता है" विशिष्टता की गारंटी नहीं देता है। हालांकि कोई यूयूआईडी वास्तव में गारंटी नहीं है, यादृच्छिक संख्याओं के साथ निर्माण करना टकरावों के लिए अतिसंवेदनशील है और लेबल "यूयूआईडी" के योग्य नहीं हो सकता है। निश्चित रूप से SecureRandom.uuid के साथ जाएं!
डोलियो

जवाबों:


312

रूबी 1.9 के रूप में, uuid पीढ़ी अंतर्निहित है। SecureRandom.uuidफ़ंक्शन का उपयोग करें ।

उदाहरण के लिए:

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"

5
SecureRandom.uuid एक यादृच्छिक UUID उत्पन्न करता है, इसलिए यह अद्वितीय के रूप में गारंटी नहीं है। यदि आप बस एक यादृच्छिक स्ट्रिंग चाहते हैं जो संभवतः अद्वितीय है तो इसका उपयोग करना ठीक होगा। हालाँकि, यदि आप कुछ ऐसा चाहते हैं जो अद्वितीय होने की गारंटी हो, तो आपको कुछ ऐसा उपयोग करने की आवश्यकता होगी जिसमें मैक एड्रेस, टाइमस्टैम्प और एट वेटेरा शामिल हों।
माइक डॉटर

23
आपको थोड़ा सा देखने के लिए, आपको 'धर्मनिरपेक्ष' की आवश्यकता होगी
जेसी शीह

8
यह अद्वितीय होने की गारंटी नहीं है, लेकिन अधिकांश व्यावहारिक उद्देश्यों के लिए, यह मान लेना सुरक्षित है कि यह अद्वितीय है। देखें: stackoverflow.com/questions/2977593/…
जेसी शीह

यदि SecureRandom.uuid RFC 4122 का अनुसरण करता है, जैसा कि यह प्रलेखन के अनुसार कहता है, इसका मतलब यह नहीं है कि इसका टाइमस्टैम्प क्षेत्र है? संगामिति को छोड़कर, इसका मतलब यह नहीं है?
माइकल के मेडिसन Michael

@MichaelKMadison AFAIK रूबी RFC 4122 के "v4" वेरिएंट का उपयोग करता है, जो टाइमस्टैम्प का उपयोग नहीं करता है, इसलिए टक्कर की संभावना वास्तव में शून्य नहीं है - लेकिन व्यवहार में यह भी हो सकता है
एडवर्ड मॉर्गन


35

हम UUIDTools का उपयोग करते हैं और इसके साथ कोई समस्या नहीं है।


2
'uuidtools' काम करता है, तब भी जब सिस्टम का कोई MAC पता नहीं है। 'uuid' इस मामले में विफल है।
grefab

3
Uuid रत्न के विपरीत, uuidtools कोई राज्य फ़ाइल नहीं रखता है। राज्य फ़ाइल के साथ अनुमति के मुद्दे कई उपयोगकर्ताओं के साथ उपयोग करने के लिए कुछ हद तक अजीब मणि बनाते हैं।
वेन कॉनराड

1
ऐसा प्रतीत होता है कि यूयूआईडी टूल्स का रखरखाव नहीं किया जाता है। 2 वर्षों में जीथुब रेपो के लिए कोई प्रतिबद्ध नहीं है
सुधांशु मिश्रा

22

क्या आपने UUIDTools को देखा ?

UUIDTools को किसी भी प्रकार के UUIDs (या GUIDs यदि आप उन्हें कॉल करना पसंद करते हैं) को उत्पन्न करने के लिए एक साधारण पुस्तकालय के रूप में डिज़ाइन किया गया था। यह जब भी संभव हो RFC 4122 के अनुरूप होता है।


16

Google निम्न रूबी लाइब्रेरी का उत्पादन करता है:

http://raa.ruby-lang.org/project/ruby-guid/

इसके अलावा, http://www.ruby-forum.com/topic/99262 पर वे कहते हैं कि आप एक रत्न स्थापित कर सकते हैं ( gem uuidइसे स्थापित करने के लिए कमांड लाइन पर निष्पादित करें) और फिर करें

gem 'uuid'
puts UUID.new

अपने कोड में एक नया UUID देखने के लिए।

(संकेत: मैं माणिक के लिए गोगल हो गया )


thx मैंने देखा कि लेकिन यह सुपर पुराना है, हाल ही में मणि की तरह सक्रिय कुछ खोज रहा है?
लांस पोलार्ड

मैं अपने उत्तर में जोड़े गए यूआईडी रत्न के बारे में कैसे? या यह कि आप जिसका जिक्र कर रहे थे?
मार्क डब्ल्यू

5
अजीब बात है ... मैं "रूबी" गाइड के रूप में अच्छी तरह से googled, और मैं सब मिला यह एसओ पद था :-P
जेसन व्हाइटहॉर्न


3

सिमोन कारलेटी उत्तर के लिए छोटा अपडेट:

SecureRandom.base64 (8) .gsub ( "/", "_")। Gsub (/ = + $ /, "")

=> "AEWQyovNFo0"

के साथ प्रतिस्थापित किया जा सकता है:

SecureRandom.urlsafe_base64 (8)


1

रात में देर से प्रोग्रामिंग करते हुए मैं रेल में एक अद्वितीय GUID बनाने के लिए निम्नलिखित समाधान (सिमोन के आधार पर) के साथ आया था। मुझे इस पर गर्व नहीं है लेकिन यह काफी अच्छा काम करता है।

while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end

2
मुझे आशा है कि आपने उस रात अपने
गाइड

0

जब मैंने इस प्रश्न में सुझाए गए uuid रत्नों का उपयोग किया, तो कोई भी अद्वितीय और यादृच्छिक UUID उत्पन्न नहीं कर सकता है। मेरा उत्तर चारों ओर का काम है, अगर हमारे पास अनुरोध को पूरा करने के लिए बाद में मणि है, तो आप रूबी में मणि का उपयोग करना बेहतर होगा।

मैं इस प्रश्न में सबसे अनुशंसित यूआईडी रत्नों की कोशिश करता हूं, लेकिन कोई भी मुझे संतुष्ट नहीं करता है, हमें अद्वितीय और यादृच्छिक यूआईडी की आवश्यकता है। मैं uuidgenरूबी में सीधे सिस्टम कमांड चलाता हूं , और मुझे परिणाम पसंद है, और यहां साझा करें।

puts `uuidgen`
8adea17d-b918-43e0-b82f-f81b3029f688
puts `uuidgen`
6a4adcce-8f64-41eb-bd7e-e65ee6d11231
puts `uuidgen`
51d5348b-8fc3-4c44-a6f7-9a8588d7f08a
puts `uuidgen`
332a0fa3-7b07-41e1-9fc8-ef804a377e4e

यदि uuidमणि के साथ तुलना करें , तो आपको अंतर पता चल जाएगा।

irb(main):003:0> uuid.generate
=> "40cdf890-ebf5-0132-2250-20c9d088be77"
irb(main):004:0> uuid.generate
=> "4161ac40-ebf5-0132-2250-20c9d088be77"

टेस्ट वातावरण linux और Mac OS वातावरण है।


2
एक puts `...`मूल रूप से एक सिस्टम कॉल करने के लिए कर रही है uuidgen(3)जो लिनक्स के अलावा अन्य किसी अन्य मंच पर विफल रहता है, निष्पादन समय के चरम मात्रा में जोड़ता है, और सामान्य रूप में वास्तव में काउंटर सहज ज्ञान युक्त कोडिंग अभ्यास है। आप ऐसी विधि का चुनाव क्यों करेंगे?
ड्वाइट स्पेंसर

1
@DwightSpencer मुझे लगता है कि हम अलग उद्देश्य के साथ अलग-अलग क्षेत्र में हैं। आप जो परवाह करते हैं, वह मेरी चिंताओं में नहीं है, जैसे कि निष्पादित समय, ऑपरेशन सिस्टम की विस्तृत श्रृंखला, कोड माइग्रेशन। मुझे लगता है कि कोड मैक ओएस या मेन स्ट्रीम लिनक्स में काम कर सकता है और मुझे सही परिणाम मिल सकता है। कॉज़ की, यदि आप रूबी में एक तरह से काम कर सकते हैं और uuidgen कमांड के समान परिणाम प्राप्त कर सकते हैं, तो मुझे इसका उपयोग करने में खुशी हो रही है। लेकिन अब तक, मुझे कोई नहीं मिला।
बीएमडब्ल्यू

1
@J_ और @ simone-carletti दोनों ने पहले ही इस पोस्ट पर एक बेहतर तरीका बताया है। मैं एक के लिए सुझाव SecureRandomदूंगा कि एक ही कार्य को उसी विधि में पहले से ही किया जा रहा है, uuidgenलेकिन uuidgenअवरोधक / देव / यादृच्छिक के उपयोग के विपरीत, SecureRandomपहले Opensl के पुस्तकालय का उपयोग करता है, फिर अंत में dev / urandom में ड्रॉप करता है / फिर प्रयास करने के लिए यादृच्छिक / dev /। गैर अवरोध यादृच्छिककरण पीढ़ी।
ड्वाइट स्पेंसर

0

यह एक नीट तकनीक है जिसे मैंने जावास्क्रिप्ट से सीखा है:

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[rand(36)]
    end
end

हालांकि अधिक 'रूबी तरीके' से कोई भी कर सकता है:

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        rand(16).to_s(16)
    end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.