ठीक है, अगर यह "उपयोग करने लगता है" तो यह कुछ रिवर्स इंजीनियरिंग करने के लिए समझ में आता है और जांचता है कि वास्तव में क्या कहा जाता है और फ़ंक्शन के कोड को अलग करें।
हालांकि, अगर आप 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 को लगातार कॉल करते रहें।
जब तक यह चल रहा हो
-
यदि आप विंडोज़ पर हैं तो आप TANEL PODER(https://blog.tanelpoder.com/2008/10/31/advanced-oracle-troubleshooting-guide-part-9-process-stack -प्रोफाइलिंग-से-एसक्लप्लस-यूजिंग-ओस्टैकप्रोफ/ )
-
यदि आप *nix पर हैं तो आप dtrace(http://www.oracle.com/technetwork/articles/servers-storage-dev/dtrace-on-linux-1956556.html ), फ्लेम ग्राफ (उपयोग परिदृश्य https://blog.dbi -services.com/oracle-database-multilingual-engine-mle/ )
मैंने विंडोज़ पर परीक्षण किया और ऐसा लगता है कि 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
. के लिए कोड निकालने का समय आ गया है यह से। हो सकता है कि मैं अगले साल इस पर कुछ समय बिताऊं।