Получение MD5 Oracle соответствовать MD5 PHP

Большинство чисел не может быть точно представлено в плаваниях. Если Вы хотите к раунду число, потому что это - то, чего требуют Ваша математическая формула или алгоритм, то Вы хотите использовать вокруг. Если Вы просто хотите ограничить дисплей определенной точностью, то даже не используйте вокруг и просто форматируйте его как ту строку. (Если Вы хотите отобразить его с некоторым альтернативным методом округления, и существуют тонны, тогда необходимо смешать два подхода.)

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

И наконец, хотя, возможно, самое главное, если Вы хотите точный математика тогда, Вы не хотите плавания вообще. Обычный пример имеет дело с деньгами и сохранить 'центы' как целое число.

11
задан Zenshai 4 August 2009 в 16:56
поделиться

5 ответов

Он возвращает необработанные байты, вам нужно преобразовать их в шестнадцатеричное.

$x = unpack("H*", $row[0]); 
echo $x[1];
14
ответ дан 3 December 2019 в 03:36
поделиться

Похоже, что то, что печатается из запроса Oracle, - это необработанный поток байтов контрольной суммы md5, искаженный, потому что большинство этих октетов не будут символами ascii. Попробуйте сначала преобразовать его в шестнадцатеричное.

7
ответ дан 3 December 2019 в 03:36
поделиться

Если вы хотите иметь md5 в Oracle, вы можете использовать этот метод:

select lower(rawtohex(md5hash('foobar'))) from dual
2
ответ дан 3 December 2019 в 03:36
поделиться

Немного молчаливо, но это сработает:

>>> class BankAccount(object): pass
...
>>> class SavingsAccount(BankAccount): pass
...
>>> class CheckingAccount(BankAccount): pass
...
>>> x = SavingsAccount()
>>> type(x) == type(SavingsAccount())
True
>>> type(x) == type(CheckingAccount())
False
-121--2995468-

Я установил 2010 с 2008 на этой машине для разработки серебряного света.. Я не заметил никаких проблем, кроме ассоциаций файлов все перейти к версии 2010, а не то, что я предпочел бы открыть в 2008 по умолчанию. (2010 год для меня намного медленнее 2008 года)

-121--2666441-

Я получил ту же самую «числовую ошибку или ошибку значения» и обнаружил, что две функции работают вместе:

CREATE OR REPLACE FUNCTION MD5RAW( v_input_string in varchar2 )
RETURN varchar2 IS
v_checksum varchar2( 32 );
BEGIN
    v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5( input_string => v_input_string );
    return v_checksum;
END;

CREATE OR REPLACE FUNCTION MD5HEX( v_input_string in varchar2 )
RETURN varchar2 IS
v_hex_value varchar2( 32 );
BEGIN
    SELECT  LOWER( RAWTOHEX( MD5RAW( v_input_string ) ) ) 
    INTO    v_hex_value
    FROM    dual;
    return v_hex_value;
END;

Затем вы можете выполнить этот запрос, чтобы получить контрольную сумму:

SELECT md5hex( 'my string smoked your hash' ) FROM dual;

Эта вторая функция делает то же самое, что и выдача инструкции SELECT, предоставленной Bazz для функции, которую вы предоставляете, но я предпочитаю не делать rawToHex -- > меньшее преобразование внутри каждого запроса. Это оставляет слишком много вещей, чтобы потенциально пойти не так каждый раз, когда вы используете запрос. Я думаю, что это может быть и быстрее, так как он компилируется во время создания, а не во время выполнения, но я могу ошибаться в этом.

1
ответ дан 3 December 2019 в 03:36
поделиться

Создайте функцию, подобную следующей:

create or replace
function md5( input varchar2 ) return sys.dbms_obfuscation_toolkit.varchar2_checksum as
begin
    return lower(rawtohex(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5( input_string => input ))));
end;

, и вызовите ее следующим образом:

select md5('foobar') from dual;

кажется, что «dbms_obfuscation_toolkit.md5» на самом деле не возвращается в исходном формате, поэтому необходимо вызвать «utl_raw.cast_to_raw». Я могу ошибаться, этому должно быть лучшее объяснение.

3
ответ дан 3 December 2019 в 03:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: