Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ORA_HASH फ़ंक्शन द्वारा उपयोग किया जाने वाला एल्गोरिथम क्या है?

ठीक है, अगर यह "उपयोग करने लगता है" तो यह कुछ रिवर्स इंजीनियरिंग करने के लिए समझ में आता है और जांचता है कि वास्तव में क्या कहा जाता है और फ़ंक्शन के कोड को अलग करें।

हालांकि, अगर आप Oracle इंटर्नल में गोता लगाना चाहते हैं तो निम्नलिखित मदद कर सकते हैं।

सबसे पहले, आपको यह पता लगाना होगा कि आंतरिक सी फ़ंक्शन को क्या कहा जाता है। ऐसा करने के लिए आप एक सत्र में कुछ लंबे समय तक चलने वाले कोड को निष्पादित कर सकते हैं। मैंने इसे चलाया था

select avg(ora_hash(rownum)) id from
(select rownum from dual connect by rownum <= 1e4),
(select rownum from dual connect by rownum <= 1e4);

यह PL/SQL कोड भी हो सकता है, आपको बस यह सुनिश्चित करने की आवश्यकता है कि आप ora_hash को लगातार कॉल करते रहें।

जब तक यह चल रहा हो

मैंने विंडोज़ पर परीक्षण किया और ऐसा लगता है कि ora_hash है ...->evaopn2()->evahash() ->...

अब इवाश के लिए गूगल करते हैं। हम बेहद भाग्यशाली हैं क्योंकि आधिकारिक साइट https://oss.oracle.com/projects/ocfs-tools/src/branches/new-dir-format/libocfs/Linux/inc/ocfshash.h evahash के लिंक के साथ।

और अंत में वास्तविक सी कोड वाला पेज है http://burtleburtle.net/bob/hash/ evahash.html

अब तक अच्छा है, हमें याद है कि अगर हम इसे लाइब्रेरी (विंडोज़ पर डीएलएल) में बनाते हैं तो हम ओरेकल में बाहरी सी फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण के लिए मेरे विन x64 पर यदि मैं फ़ंक्शन हस्ताक्षर को बदलता हूं

extern "C" ub4 hash( ub1 *k, ub4 length, ub4 initval)

इसे Oracle से सफलतापूर्वक निष्पादित किया जा सकता है। लेकिन, जैसा कि आप देखते हैं, हस्ताक्षर Oracle में ora_hash से थोड़ा अलग है। यह फ़ंक्शन मान, इसकी लंबाई और initval (बीज हो सकता है) को स्वीकार करता है जबकि Oracle में हस्ताक्षर ora_hash (expr, max_bucket, Seed_value) है।

आइए परीक्षण करने का प्रयास करेंOracle

SQL> select ora_hash(utl_raw.cast_to_raw('0'), power(2, 32) - 1, 0) oh1,
  2         ora_hash('0', power(2, 32) - 1, 0) oh2,
  3         ora_hash(0, power(2, 32) - 1, 0) oh3,
  4         ora_hash(chr(0), power(2, 32) - 1, 0) oh4
  5    from dual;

       OH1        OH2        OH3        OH4
---------- ---------- ---------- ----------
3517341953 3517341953 1475158189 4056412421

सी

int main()
{
    ub1 ta[] = {0};
    ub1* t = ta;
    cout << hash(t, 1, 0) << endl;
    ub1 ta0[] = {'0'};
    ub1* t0 = ta0;
    cout << hash(t0, 1, 0) << endl;
    return 0;
}

1843378377
4052366646

कोई भी संख्या मेल नहीं खाती। तो समस्या क्या है?ora_hash लगभग किसी भी प्रकार के मापदंडों को स्वीकार करता है (उदाहरण के लिए select ora_hash(sys.odcinumberlist(1,2,3)) from dual ) जबकि सी फ़ंक्शन बाइट्स की सरणी के रूप में मान स्वीकार करता है। इसका मतलब है कि कुछ रूपांतरण फ़ंक्शन कॉल से पहले होता है। इस प्रकार उल्लिखित सी हैश फ़ंक्शन का उपयोग करने से पहले आपको यह पता लगाना होगा कि इसे पास करने से पहले वास्तविक मूल्य कैसे परिवर्तित होता है।

आप आईडीए प्रो + हेक्स किरणों का उपयोग करके ओरेकल बायनेरिज़ की रिवर्स इंजीनियरिंग के साथ आगे बढ़ सकते हैं लेकिन इसमें कुछ दिन लग सकते हैं। प्लेटफ़ॉर्म विशिष्ट विवरण का उल्लेख नहीं करना।

इसलिए यदि आप ora_hash की नकल करना चाहते हैं, तो सबसे आसान विकल्प यह होगा कि आप Oracle एक्सप्रेस संस्करण स्थापित करें और इसका उपयोग ora_hash को कॉल करने के लिए करें।

मुझे आशा है कि यह दिलचस्प था। शुभकामनाएँ।

अपडेट करें

ora_hash और dbms_utility.get_hash_value को एक दूसरे से मैप किया जा सकता है (देखें https:/ /jonathanlewis.wordpress.com/2009/11/21/ora_hash-function/ )

SQL> select dbms_utility.get_hash_value('0', 0 + 1, 1e6 + 1) ha1,
  2         ora_hash('0', 1e6, 0) + 1 ha2
  3    from dual;

       HA1        HA2
---------- ----------
    338437     338437

यदि हम dbms_utility के पैकेज बॉडी को खोलते हैं तो हम निम्नलिखित घोषणा देखेंगे

  function get_hash_value(name varchar2, base number, hash_size number)
    return number is
  begin
    return(icd_hash(name, base, hash_size));
  end;

और

  function icd_hash(name      varchar2,
                    base      binary_integer,
                    hash_size binary_integer) return binary_integer;
  pragma interface(c, icd_hash);

आइए icd_hash . के लिए गूगल करें और हम पा सकते हैं कि इसे _psdhsh . में मैप किया गया है (https://yurichev.com/blog/50/ ) अब oracle.exe को अलग करने और _psdhsh . के लिए कोड निकालने का समय आ गया है यह से। हो सकता है कि मैं अगले साल इस पर कुछ समय बिताऊं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 19 . के लिए हाइबरनेट बोली

  2. Oracle Sql में कॉलम रो ट्रांसफर

  3. ORA-00900 का समाधान कैसे करें

  4. UTF-8 के बजाय windows-1252 का उपयोग करने में कुछ भी गलत है

  5. समूह एसक्यूएल (ओरेकल) द्वारा कुल चल रहा है