2011-02-17 14 views
6

से एक छोटी हैश स्ट्रिंग उत्पन्न करने का सबसे अच्छा तरीका क्या है मैं रूबी में लंबे तारों से छोटे गैर-टकराव तार बनाने की कोशिश कर रहा हूं। ऐसा करने का सबसे अच्छा तरीका क्या है? बेस 64 एडीडी एक एमडी 5 हैश?लंबी स्ट्रिंग

loop do 
    key = short_hash("#{user_id}-#{timestamp}") 
    break if $redis.setnx(key, "0") 
end 

मैं कुंजी बहुत लंबा हो नहीं करना चाहती:

यह उपयोग है।

+0

इसी साइट के बारे में इस साइट पर प्रश्नों का एक समूह है। हैशिंग विषयों की खोज करने का प्रयास करें। यहां एक है: http://stackoverflow.com/questions/4066601/developing-a-url-shortener/4066615#4066615 –

+1

@ सुगमैन: यह प्रश्न पायथन में है। –

+2

यदि आप उन्हें पढ़ते हैं तो उस प्रतिक्रिया (और अन्य) धागे में प्रतिक्रिया से आप क्या एकत्र कर सकते हैं यह है कि ऐसा करने का "सबसे अच्छा तरीका" भाषा अज्ञेयवादी है। पहले अपने हैशिंग एल्गोरिदम चुनें, और फिर भाषा-विशिष्ट कार्यान्वयन के बारे में चिंता करें। –

उत्तर

4

मैं अक्सर आपके पास उदाहरण के समान SHA का उपयोग करता हूं। यह अद्वितीय होने की गारंटी नहीं है, लेकिन आमतौर पर सबसे प्रयोजनों के लिए काफी अच्छा है:

require 'digest/sha1' 
Digest::SHA1.hexdigest("#{user_id}-#{Time.now.to_i}-#{rand}") 

ruby UUID gem एक और विकल्प है।

लेकिन जब आप रेडिस का उपयोग कर रहे हैं तो अपने विशिष्ट मामले में, क्यों न केवल रेडिस INCR कमांड का उपयोग करें? फिर आप कम से कम अपने डेटाबेस में विशिष्टता की गारंटी दे सकते हैं। उदाहरण के लिए:

unique_key = $redis.incr('users:next') 
+0

हम्म मैं 'incr' का उपयोग करने के बारे में सोच रहा था, लेकिन मुझे unique_key के लिए एक मूल्य स्टोर करने की आवश्यकता है ... मुझे लगता है कि मैं' uid = $ r.incr ('uids') कर सकता हूं; $ r.set (uid, value) ' –

+0

तो मैं 'incr' के साथ जा रहा था - लेकिन मेरे मूल प्रश्न के लिए, मैं' Digest :: SHA1.hexdigest' की तुलना में एक छोटा हैश होने की उम्मीद कर रहा था। मुझे लगता है कि मैं बेस 64 एन्कोडिंग का उपयोग कर सकता हूं ... –

4

आप छोटे स्ट्रिंग्स बनाने के लिए हैश फ़ंक्शन का उपयोग कर सकते हैं जो को टक्कर मारने की संभावना नहीं है। हालांकि, Pigeonhole principle की गारंटी देता है कि आप दो लंबे तारों को खोजने में सक्षम होंगे जो एक ही मूल्य के लिए हैश होगा।

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

+0

क्षमा करें, मैं यह उल्लेख करना भूल गया कि मैं टकराव की जांच कर रहा हूं और पुनः प्रयास कर रहा हूं। मैं बस जितना संभव हो सके "retries" से बचना चाहता हूँ। –

संबंधित मुद्दे