में बाइनरी स्ट्रिंग्स पर हैमिंग दूरी मेरे पास मेरे डीबी में एक टेबल है जहां मैं एक BINARY (32) कॉलम में SHA256 हैश स्टोर करता हूं।एसक्यूएल
SELECT * FROM table
ORDER BY HAMMINGDISTANCE(hash, UNHEX(<insert supplied sha256 hash here>)) ASC
LIMIT 10
(मामले में आप सोच रहे हैं, तार ए और बी की आलोचनात्मक अंतर: मैं एक तरह से एक की आपूर्ति की मूल्य, यानी कुछ की तरह करने के लिए स्तंभ में प्रविष्टियों की आलोचनात्मक अंतर की गणना करने के लिए देख रहा हूँ BIT_COUNT(A^B)
के रूप में परिभाषित किया गया है, जहां^बिटवाई एक्सओआर ऑपरेटर है और BIT_COUNT द्विआधारी स्ट्रिंग में 1s की संख्या देता है)।
अब, मुझे पता है कि^ऑपरेटर और BIT_COUNT फ़ंक्शन केवल INTEGERs पर काम करते हैं और इसलिए मैं कहूंगा कि शायद ऐसा करने का एकमात्र तरीका सबस्ट्रिंग्स में बाइनरी स्ट्रिंग को तोड़ना होगा, प्रत्येक बाइनरी सबस्ट्रिंग को कास्ट करना होगा पूर्णांक, हथौड़ा दूरी को प्रतिस्थापित करने के लिए गणना करें और फिर उन्हें जोड़ें। इसके साथ समस्या यह है कि यह बहुत जटिल, कुशल नहीं है और निश्चित रूप से सुरुचिपूर्ण नहीं लगता है। मेरा सवाल इसलिए है: क्या आप किसी भी बेहतर तरीके से सुझाव दे सकते हैं? (कृपया ध्यान दें कि मैं साझा होस्टिंग पर हूं और इसलिए मैं डीबी सर्वर या लोड लाइब्रेरीज़ को संशोधित नहीं कर सकता)
संपादित करें (1): स्पष्ट रूप से PHP में पूरी तालिका लोड करना और गणना करना संभव होगा लेकिन मैं इसके बजाय इसे टालना क्योंकि यह तालिका शायद काफी बड़ी हो जाएगी।
संपादित करें (2): डीबी सर्वर MySQL 5.1 है
संपादित करें (3): मेरा जवाब नीचे दिए गए कोड है कि मैं सिर्फ ऊपर वर्णित हैं।
संपादित करें (4): मुझे पता चला है कि एक बिएनरी (32) के बजाय हैश को स्टोर करने के लिए 4 बिगिनट्स का उपयोग करके भारी गति सुधार (100 गुना तेजी से) उत्पन्न होता है। नीचे दिए गए मेरे उत्तर में टिप्पणियां देखें।
मुक्त भी हैश स्टोर करने के लिए अलग अलग तरीके सुझाने के लिए महसूस करता है, तो यह एक खोजने में उपयोगी साबित हो सकता है बेहतर समाधान – CAFxX
यदि आप हैश को 8 पूर्णांक (शायद बाइनरी स्टोरेज के अतिरिक्त) में स्टोर करेंगे, तो गणना बहुत आसान हो जाती है। – Andomar
मैं वास्तव में उत्सुक हूं कि आप दूरी की गणना क्यों करना चाहते हैं :) – Nanne