Как обрабатывается ввод в функцию MySQL md5? - PullRequest
2 голосов
/ 26 октября 2009

У меня проблемы с пониманием того, как обрабатывается ввод в функцию md5 в MySQL 4.1.22. По сути, я не могу воссоздать md5sum определенной комбинации значений для сравнения. Я думаю, это как-то связано с форматом входных данных.

Я создал таблицу с двумя столбцами типа double (направление и высота) + третий для хранения суммы md5.

С помощью сценария установки я добавляю данные в поля направлений и высот + создаю контрольную сумму, используя следующий синтаксис:

insert into polygons (
  direction, 
  elevation, 
  md5sum
) 
values ( 
  (select radians(20.0)), 
  (select radians(30.0)), 
  ( md5( (select radians(20.0)) + (select radians(20.0)) ) )
)

, что в итоге выглядит как 0.349065850398866, 0.523598775598299, '0c2cd2c2a9fe40305c4e3bd991812df5'

Позже я сравниваю сохраненную md5sum с вновь рассчитанной, заново рассчитанная создается с использованием md5('0.349065850398866' + '0.523598775598299'), и я получаю следующую контрольную сумму: '8c958bcf912664d6d27c50f1034bdf34'

Если я изменю последнее десятичное число в переданной «строке» с 9 на 8 0.523598775598298, я получу ту же контрольную сумму, что и ранее сохраненная, '0c2cd2c2a9fe40305c4e3bd991812df5'. Любое значение последнего десятичного числа от 8 до 0 дает такую ​​же контрольную сумму.

Использование BINARY, (md5( (select BINARY(radians(20.0))) + (select BINARY(radians(20.0))) ) в скрипте установки создает ту же контрольную сумму, что и мой исходный "расчет времени выполнения"

Стоит отметить, что оригинальный метод работает для всех остальных строк, которые у меня есть (55)

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

Ответы [ 2 ]

2 голосов
/ 26 октября 2009

Два числа, которые вы добавляете, хранятся в двоичной форме, но отображаются в десятичной форме. Нет никакой гарантии, что вы вернете точно такой же номер, если вернете десятичную форму на машину.

В этом случае это добавление дает немного другой результат, что дает совершенно другую сумму MD5:

mysql> select radians(20.0) + radians(30.0), '0.349065850398866' + '0.523598775598299';
+-------------------------------+-------------------------------------------+
| radians(20.0) + radians(30.0) | '0.349065850398866' + '0.523598775598299' |
+-------------------------------+-------------------------------------------+
|              0.87266462599716 |                          0.87266462599717 | 
+-------------------------------+-------------------------------------------+
1 row in set (0.00 sec)

Если вы хотите последовательно получать один и тот же результат, вам нужно где-то хранить результаты radians(20.0) и radians(30.0) в переменных, не полагаясь на их печатные представления.

0 голосов
/ 30 октября 2009

Выходные данные в радианах (20,0) вычисляются с гораздо большим количеством цифр, чем показано в печатном виде. Когда результат передается в функцию md5, используется полное неусеченное значение, тогда как напечатанное значение будет показывать только ограниченное количество цифр. Таким образом, в обоих случаях в функцию md5 передается не одно и то же значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...