2012-05-31 57 views
1
DECLARE 
    l_string NVARCHAR2(600) := '123456'; 
    checksum NVARCHAR2(600); 

BEGIN 

    DBMS_OUTPUT.DISABLE; 
    DBMS_OUTPUT.ENABLE(1000000); 

    DBMS_OBFUSCATION_TOOLKIT.md5 (input_string => l_string, checksum_string => checksum); 

    DBMS_OUTPUT.PUT_LINE(RAWTONHEX(utl_raw.cast_to_raw(checksum))); 

END; 

期望值:e10adc3949ba59abbe56e057f20f883eNVARCHAR2轉換爲MD5哈希在甲骨文DBMS_OBFUSCATION_TOOLKIT.MD5

但它返回:FFFD00390049FFFD0059FFFDFFFD0056FFFD000FFFFD003E

注意我想保持NVARCHAR2數據類型。校驗和變量的值存儲在類型爲nvarchar2的列中。

我知道md5接受並返回varchar2中的數據。但如果有人可以幫助我使用nvarchar2數據類型來解決這個問題,那就太好了。

的NLS_CHARACTERSET = AL32UTF8

+0

當你得到'ORA-28231:沒有數據傳遞給模糊工具包'時,這段代碼不會運行。因爲你沒有把'l_string'設置成任何東西都是有意義的。那麼你從哪裏得到預期和實際的校驗和?在一個不相關的說明中,爲什麼「提交」? –

+0

對不起,l_string的值= 123456。同意不需要提交。 – user357086

+0

請更新代碼以顯示您運行的確切代碼,包括123456. –

回答

0

以下應經由DBMS_CRYPTO使用散列工作()

declare 
    l_src nvarchar2(100) := '123456'; 
    l_raw_hash raw(100); 
begin 
    l_raw_hash := dbms_crypto.hash(to_clob(l_src), dbms_crypto.HASH_MD5); 
    dbms_output.put_line(l_raw_hash); 
end; 

結果:E10ADC3949BA59ABBE56E057F20F883E

l_raw_hash將在原始格式。您可以使用UTL_RAW將其轉換爲另一種數據類型。只要確保您的顯示器顯示正確的字符集或事物會看起來有趣。