2012-06-20 24 views
37

क्या आरजीबी रंग मूल्य में मनमानी स्ट्रिंग को कैसे हैश करने के बारे में कोई अच्छा अभ्यास है? या अधिक सामान्य होने के लिए: 3 बाइट्स तक।आरजीबी रंग में हैश स्ट्रिंग

आप पूछ रहे हैं: मुझे कभी इसकी आवश्यकता कब होगी? इससे कोई फर्क नहीं पड़ता, लेकिन उन ट्यूब ग्राफों को किसी भी गिटहब network page पर कल्पना करें।

git branches

कहाँ हर रंग का लाइन एक अलग Git शाखा का अर्थ है: वहाँ आप कुछ इस तरह देख सकते हैं। इन शाखाओं के रंग के लिए कम तकनीक दृष्टिकोण एक CLUT (रंग लुकअप टेबल) होगा। अधिक परिष्कृत संस्करण होगा:

$branchColor = hashStringToColor(concat($username,$branchname)); 

क्योंकि जब भी आप शाखाओं का प्रतिनिधित्व देखते हैं तो आप एक स्थिर रंग चाहते हैं। और बोनस अंक के लिए: आप उस हैश फ़ंक्शन का रंग वितरण कैसे सुनिश्चित करते हैं?

तो मेरे प्रश्न का उत्तर hashStringToColor() के कार्यान्वयन के लिए उबलता है।

उत्तर

26

एक अच्छा हैश फ़ंक्शन कुंजी स्थान पर लगभग समान वितरण प्रदान करेगा। यह सवाल को कम करता है कि मैं एक यादृच्छिक 32 बिट संख्या को 3 बाइट आरजीबी स्पेस में कैसे परिवर्तित करूं। मुझे कम 3 बाइट लेने के साथ कुछ भी गलत नहीं लगता है।

int hash = string.getHashCode(); 
int r = (hash & 0xFF0000) >> 16; 
int g = (hash & 0x00FF00) >> 8; 
int b = hash & 0x0000FF; 
+0

बहुत अच्छा काम किया, धन्यवाद। – clayzermk1

+9

हालांकि यदि आप पठनीय रंगों को सुनिश्चित करना चाहते हैं (उदाहरण के लिए पर्याप्त पर्याप्त विपरीत, और संतृप्ति सुनिश्चित करें), तो आपको उससे थोड़ा अधिक काम करना होगा। एचएसवी या एलएबी में काम करना आसान हो सकता है, और आरजीबी में परिवर्तित हो सकता है। – naught101

+0

लवली समाधान! –

2

उदाहरण के तौर पर, this is how Java calculates the hashcode of a string (रेखा 14 9 4 और निम्नलिखित)। यह int देता है। इसके बाद आप "0 जीके मॉड्यूल को 16,777,216 (2^24 = 3 बाइट्स) के साथ" आरजीबी-संगत "नंबर प्राप्त करने के लिए गणना कर सकते हैं।

यह एक निर्धारिक गणना है इसलिए एक ही शब्द (ओं) में हमेशा एक ही रंग होगा। हैश टकराव की संभावना (2 रंग एक ही रंग वाले) छोटे हैं। रंग वितरण के बारे में निश्चित नहीं है, लेकिन शायद काफी यादृच्छिक है।

+0

मुझे लगता है कि हैश टकराव उपेक्षित किया जा सकता है, के बाद से जब एक टक्कर होती है कि एक मुद्दे के ज्यादा नहीं है जब तक आप (उदाहरण की तरह पड़ोसियों रंग की जरूरत नहीं है के रूप में दिया गया) अलग होना चाहिए। –

+1

रंग वितरण की यादृच्छिकता एक सौंदर्य समस्या हो सकती है। बहुत सारे 'बदसूरत' रंग हैं, यह एक व्यावहारिक विचार हो सकता है कि घटकों को कुछ प्रकार के वजन को लागू करने के लिए सुंदर: बदसूरत अनुपात बेहतर हो। :) – Wug

19

वहाँ किसी भी जावास्क्रिप्ट उपयोगकर्ताओं के लिए, मैं @erlycoder से djb2 हैश फंक्शन के साथ जेफ-पालक से स्वीकार किए जाते हैं जवाब संयुक्त।

सवाल प्रति परिणाम:

function djb2(str){ 
    var hash = 5381; 
    for (var i = 0; i < str.length; i++) { 
    hash = ((hash << 5) + hash) + str.charCodeAt(i); /* hash * 33 + c */ 
    } 
    return hash; 
} 

function hashStringToColor(str) { 
    var hash = djb2(str); 
    var r = (hash & 0xFF0000) >> 16; 
    var g = (hash & 0x00FF00) >> 8; 
    var b = hash & 0x0000FF; 
    return "#" + ("0" + r.toString(16)).substr(-2) + ("0" + g.toString(16)).substr(-2) + ("0" + b.toString(16)).substr(-2); 
} 

अद्यतन: फिक्स्ड रिटर्न स्ट्रिंग हमेशा एक # 000000 प्रारूप हेक्स @alexc द्वारा एक संपादन के आधार पर स्ट्रिंग वापस जाने के लिए (धन्यवाद!)।

+3

आप रंग को इस तरह प्रारूपित भी कर सकते हैं: "आरजीबी (" + आर + "," + जी + "," + बी + ")" –

+1

@StuGla: मुझे याद नहीं है कि हेक्स प्रारूप का हिस्सा था या नहीं आवश्यकताओं; इसे अब पढ़ना ऐसा प्रतीत नहीं होता है। चूंकि सवाल सामान्य रूप से पूछा गया था, मुझे लगता है कि लेखक रंग स्ट्रिंग के प्रारूप की तुलना में हैशिंग एल्गोरिदम में अधिक रुचि रखते थे। हालांकि, अगर प्रश्न का संदर्भ सीएसएस है, तो यह करने के लिए आपका एक बहुत साफ तरीका होगा। चीयर्स मैन, धन्यवाद! – clayzermk1

+0

@StuGla: यह पारदर्शिता जोड़ने के लिए भी अनुमति देता है। – MastaBaba

8

मैंने प्रदान किए गए सभी समाधानों की कोशिश की लेकिन पाया कि समान तार (स्ट्रिंग 1 बनाम स्ट्रिंग 2) रंगों का उत्पादन करते हैं जो मेरी पसंद के लिए बहुत समान हैं। इसलिए, मैंने दूसरों के इनपुट और विचारों से अपना खुद का प्रभाव बनाया।

यह स्ट्रिंग के एमडी 5 चेकसम की गणना करेगा, और आरजीबी 24-बिट कोड को परिभाषित करने के लिए पहले 6 हेक्स अंकों को ले जाएगा।

MD5 कार्यक्षमता एक खुला स्रोत JQuery में प्लग है जे एस समारोह इस प्रकार है:।

function getRGB(str){ 
    var hash = $.md5(str); 
    var rgb = '#' + hash.substring(0,2) + hash.substring(2,4) + hash.substring(4,6); 
    return rgb; 
} 

इस काम कर उदाहरण के लिए एक लिंक jsFiddle पर है। बस इनपुट फ़ील्ड में एक स्ट्रिंग इनपुट करें और एंटर दबाएं, और अपने निष्कर्षों की तुलना करने के लिए बार-बार ऐसा करें।

+0

आप लाइन 3 को सरल बना सकते हैं: 'var rgb =' # '+ हैश.substring (0,6); ' –

+0

* मैंने प्रदान किए गए सभी समाधानों की कोशिश की (...) * नहीं, आपने नहीं किया :) जेफ फोस्टर का जवाब ** अनंत ** कई समाधान के साथ परिवार का वर्णन करता है। आपका समाधान इस परिवार का सदस्य है, बीटीडब्ल्यू। –

4

मैं सिर्फ रंग-हैश नामक एक जावास्क्रिप्ट लाइब्रेरी का निर्माण करता हूं, जो दिए गए स्ट्रिंग (एचएसएल कलर स्पेस और बीकेडीआरएश का उपयोग करके) पर आधारित रंग उत्पन्न कर सकता है।

रेपो: https://github.com/zenozeng/color-hash
डेमो: https://zenozeng.github.io/color-hash/demo/

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

  • कोई संबंधित समस्या नहीं^_^