2015-09-29 8 views
5

मैं एक REST API (नैन्सी में बनाया गया है, ASP.NET पर चल रहा है) है कि इस तरह एक JSON ऑब्जेक्ट लौट सकते है।ईटीएजी उत्पन्न करने के लिए एक प्रभावी और प्रसंस्करण-सस्ते एल्गोरिदम क्या है? बजाय इसे एक प्रतिनिधित्व है</p> <pre><code>{ id: "1", name: "Fred", reviews: [ { id: "10", content: "I love Stack Overflow" } ] } </code></pre> <p>नोट कैसे इस वस्तु एक सीधा इकाई नहीं है,:

आमतौर पर, मैं डीबी में एटीएजी के रूप में डीबी में इकाई के अंतिम संशोधित/टाइमस्टैम्प का उपयोग करता हूं, फिर जब यह अपडेट हो जाता है, तो ईटाग अपडेट हो जाता है। सरल।

लेकिन इस मामले में, यदि उपयोगकर्ता नहीं बदलता है, लेकिन पहली समीक्षा की सामग्री में परिवर्तन होता है? उपरोक्त ईटीएजी तर्क का उपयोग करके, यह नहीं बदलेगा। हमारे यहां एक मामला है जहां प्रतिनिधित्व में कई इकाइयां शामिल हैं, और मैं विशिष्ट रूप से इसकी पहचान करने का एक तरीका ढूंढने की कोशिश कर रहा हूं।

तो मुझे किसी भी तरह से उस प्रतिनिधित्व की पहचान करने की आवश्यकता है (जो एक साधारण सी # पॉको है, जिसे रेडिस कैश में संग्रहीत किया जाता है)।

  • Object.GetHashCode():

    यहाँ मेरी प्रारंभिक विचार कर रहे हैं। काम नहीं करेगा, क्योंकि स्मृति संदर्भ हमेशा अलग होगा।

  • मेमोरी स्ट्रीम ऑब्जेक्ट, SHA1 हैश इसे। हर समय करने के लिए महंगा है।
  • कैश जोड़ने/अपडेट करने से पहले, ईटीएजी के लिए उपयोग करने के लिए एक GUID बनाएं और कैश में भी स्टोर करें। फिर जब कैश फिसल जाता है (जो पिछले उदाहरण में होगा, तो एक नया GUID उत्पन्न होता है और ईटीएजी अपडेट किया जाता है। इस दृष्टिकोण के साथ समस्या यह है कि मैं अपने कैशिंग कार्यान्वयन के लिए अपना ईटीएजी तंत्र बांध रहा हूं (इसलिए कम से कम युग्मित नहीं)।

क्या कोई इसे वैश्विक स्तर पर आदर्श रूप से करने के लिए एक सस्ता/प्रभावी तरीका सोच सकता है? (उदाहरण के लिए प्रत्येक इकाई/संसाधन के लिए विशिष्ट ईटीएजी पीढ़ी तर्क के बजाय Object, या मूल वस्तु)।

बहुत धन्यवाद!

उत्तर

1

मुझे लगता है कि हैशिंग दृष्टिकोण इतना बुरा नहीं है। MurmurHash3 (128 बिट संस्करण) और xxHash (64 बिट संस्करण) जैसे चरमपंथी कुशल हैश एल्गोरिदम हैं जिन्हें मैं मानता हूं। यह वैश्विक स्तर पर ऐसा करने का एक प्रभावी तरीका है, लेकिन दुर्भाग्य से यह सबसे सस्ता नहीं है। आप सी # कार्यान्वयन here और here पा सकते हैं।

आपने कहा कि डेटाबेस में प्रत्येक इकाई में एक संशोधित टाइमस्टैम्प है। यदि मॉडल कई इकाइयों द्वारा रचित है, मॉडल ईटाग इकाइयों टाइमस्टैम्प से लिया जा सकता है। मॉडल ईटाग इकाइयों टाइमस्टैम्प का समापन होगा। यह दृष्टिकोण अधिक कुशल है लेकिन आप इसे वैश्विक रूप से नहीं कर सकते हैं, आपको प्रत्येक मॉडल के लिए विशिष्ट कोड लिखना होगा।

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