2010-03-23 15 views
10

के साथ जावास्क्रिप्ट में बड़े तारों की तुलना करना मेरे पास एक टेक्स्टरीए वाला एक फॉर्म है जिसमें बड़ी मात्रा में सामग्री (कहें, ब्लॉग के लिए लेख) शामिल हो सकते हैं, जिसमें कई तृतीय पक्ष समृद्ध टेक्स्ट एडिटर्स का उपयोग करके संपादित किया जा सकता है। मैं एक ऑटोसव सुविधा की तरह कुछ लागू करने की कोशिश कर रहा हूं, जो बदल गया है तो AJAX के माध्यम से सामग्री जमा करनी चाहिए। हालांकि, मुझे इस तथ्य के आसपास काम करना है कि मेरे पास कुछ संपादकों के विकल्प हैं जो "गंदे" ध्वज का समर्थन नहीं करते हैं, या एक "बदले" कार्यक्रम का उपयोग नहीं करते हैं, जिसका उपयोग मैं यह देखने के लिए कर सकता हूं कि अंतिम सहेजने के बाद सामग्री बदल गई है या नहीं।हैश

तो, एक कामकाज के रूप में, मैं जो करना चाहता हूं वह सामग्री को एक चर में रखता है (चलो इसे आखिरी सहेजने के लिए आखिरी बचाएं), और वर्तमान पाठ के साथ इसकी तुलना करें जब " ऑटोसेव "फ़ंक्शन आग (टाइमर पर) यह देखने के लिए कि यह अलग है या नहीं। हालांकि, मुझे चिंता है कि कितनी मेमोरी बहुत बड़ी दस्तावेजों के साथ हो सकती है।

क्या यह पूरे स्ट्रिंग के बजाय, अंतिम SaveContent चर में किसी प्रकार का हैश स्टोर करने के लिए और अधिक कुशल होगा, और उसके बाद हैश मानों की तुलना करें? यदि हां, तो क्या आप एक अच्छी जावास्क्रिप्ट लाइब्रेरी/jquery प्लगइन की अनुशंसा कर सकते हैं जो इस आवश्यकता के लिए उपयुक्त हैश लागू करता है?

+0

यह शायद आपके उपयोग के मामले में लगभग कभी नहीं होगा, लेकिन यहां पर रहने वाले अनौपचारिक पाठक के लिए जो जावास्क्रिप्ट और हैशिंग (मेरे जैसे) की तलाश में भूमि पर होता है, यह ध्यान देने योग्य हो सकता है कि दो हैश मानों की तुलना करना * नहीं * दो तारों की तुलना करने के समान, हैश (और इच्छा) टकरा सकता है, वह है .. दो अलग-अलग तारों के लिए एक ही हैश। इसलिए यदि आप वही हैश मान प्राप्त करते हैं तो कई उपयोग मामलों में आपको पूर्ण तुलना करना चाहिए। –

+0

अच्छा बिंदु। इसके अतिरिक्त, यदि वे पाठक सोच रहे हैं, तो हैशटेबल ऑब्जेक्ट्स, जैसे कि कई संग्रह API में पाए गए कारण, अभी भी इसके बावजूद काम करते हैं क्योंकि उनमें इन टकरावों को संभालने की कार्यक्षमता होती है जब दो कुंजियां एक ही हैश उत्पन्न करती हैं। – user4815162342

उत्तर

19

संक्षेप में, आप केवल दो तारों को संग्रहित और तुलना करने से बेहतर हैं।


एक उचित हैश गणना की जा रही नहीं सस्ती है। उदाहरण के लिए, स्ट्रिंग के MD5 हैश की गणना के लिए pseudo code या actual JavaScript implementation देखें। इसके अलावा, सभी उचित हैश कार्यान्वयन के लिए स्ट्रिंग के वर्णों की गणना करने की आवश्यकता होगी।

इसके अलावा, आधुनिक कंप्यूटिंग के संदर्भ में, एक तार होने की वास्तव में, वास्तव में लंबे अन्य स्ट्रिंग के खिलाफ उसकी तुलना से पहले धीमी है है। आप यहां क्या कर रहे हैं प्रभावी रूप से एक माइक्रो-अनुकूलन है। मेमोरी कोई मुद्दा नहीं होगा, न ही सीपीयू चक्र दो तारों की तुलना करेगा।

के अनुकूलन के सभी मामलों के साथ के रूप में: जांच इस वास्तव में एक समस्या यह है कि इससे पहले कि आप इसे हल। एक त्वरित परीक्षण में मैंने किया, कंप्यूटिंग और 2 एमडी 5 रकम की तुलना में 382ms लिया। दो तारों की तुलना में सीधे 0ms लिया। यह एक स्ट्रिंग का उपयोग कर रहा था जो 10000 शब्द लंबा था। http://jsfiddle.net/DjM8S देखें।

आप वास्तव में एक मुद्दा के रूप में देखते हैं, मैं भी दृढ़ता से एक गरीब-मनुष्य तुलना उपयोग करने पर विचार होगा, और वास्तविक स्ट्रिंग तुलना के बजाए, यह देखने के लिए कि क्या वे बदल गए हैं या नहीं, केवल 2 तारों की लंबाई की तुलना करना।

.

+0

ठीक है, मान लें कि उपयोगकर्ता इसके बजाय उपन्यास का अध्याय पोस्ट करना चाहता था। लेखों को "बाइबल के विशाल निकालने" की लंबाई पर विचार करने के लिए कितना समय लगेगा? – user4815162342

+2

स्ट्रिंग MD5'ing, फिर "पिछला" md5 योग की तुलना में, 382ms लगता है। मूल स्ट्रिंग तुलना 0ms लेता है; यह एक स्ट्रिंग का उपयोग कर रहा है जो ~ 10000 शब्द लंबा है। (http://www.jsfiddle.net/DjM8S/) – Matt

+0

धन्यवाद। यह दोनों का बेहतर जवाब है, और जिस तरह का उत्तर मैं ढूंढ रहा था (हालांकि दूसरा जवाब सूचनात्मक भी है)। मैं इसके लिए वोट दूंगा, लेकिन स्पष्ट रूप से एक नए उपयोगकर्ता के रूप में मेरे पास पर्याप्त प्रतिष्ठा नहीं है। – user4815162342

4

एक MD5 हैश अक्सर फ़ाइल या दस्तावेज़ की अखंडता को सत्यापित करने के लिए उपयोग किया जाता है; यह आपके उद्देश्यों के लिए काम करना चाहिए। Here जावास्क्रिप्ट में MD5 हैश उत्पन्न करने पर एक अच्छा लेख है।

+0

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

1

मैंने एक JSperf rev बनाया जो प्रदर्शन मापने के लिए यहां उपयोगी हो सकता है। कृपया मेरे द्वारा किए गए विभिन्न संशोधन और विभिन्न प्रकार के चेक जोड़ें!

http://jsperf.com/long-string-comparison/2

मैंने पाया दो प्रमुख परिणाम

  • जब तार कर रहे हैं समान प्रदर्शन की हत्या कर दी है; से ~ 9000000 ऑप्स/s ~ 250 ऑप्स/सेक (क्रोम)
  • IE9 के 64 बिट संस्करण बहुत मेरे पीसी पर धीमी है, एक ही परीक्षण से परिणाम:

    +------------+------------+ 
    | IE9 64bit | IE9 32bit | 
    +------------+------------+ 
    | 4,270,414 | 8,667,472 | 
    | 2,270,234 | 8,682,461 | 
    +------------+------------+ 
    

दुख की बात है , jsperf ने दोनों परिणामों को "आईई 9" के रूप में लॉग किया।

जेएस एमडी 5 प्रदर्शन पर भी एक अग्रदूत देखो मुझे बताता है कि यह बहुत धीमा है (कम से कम बड़े तारों के लिए, http://jsperf.com/md5-shootout/18 देखें - 70 ऑप्स/सेकेंड पर चोटियों)। मैं हैश गणना या बैकएंड की तुलना AJAXing करने की कोशिश करने के लिए जाना चाहता हूं लेकिन मेरे पास परीक्षण करने का समय नहीं है, क्षमा करें!

+0

और यह भी, http://stackoverflow.com/a/10542872/694325। – Nenotlep