Конвертировать NVARCHAR2 в MD5 Hash в Oracle DBMS_OBFUSCATION_TOOLKIT.MD5

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;

Ожидаемое значение: e10adc3949ba59abbe56e057f20f883e

Но он возвращает: FFFD00390049FFFD0059FFFDFFFD0056FFFD000FFFFD003E

Примечание. Я хочу сохранить тип данных nvarchar2. Значение из переменной контрольной суммы сохраняется в столбце типа nvarchar2.

Мне известно, что md5 принимает и возвращает данные в varchar2. Но если кто-то может помочь мне разобраться с этим, используя тип данных nvarchar2, это было бы здорово.

NLS_CHARACTERSET = AL32UTF8

1 ответ

Решение

Следующее должно работать через dbms_crypto с использованием hash()

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, чтобы преобразовать его в другой тип данных. Просто убедитесь, что ваш дисплей показывает правильный набор символов, или вещь будет выглядеть интересно.

Другие вопросы по тегам