Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Непонятно как работает md5 в mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Не сходится сумма md5 сгенерированая в MySql и на сервере apache2
dubasua
Отправлено: 19 Октября, 2012 - 16:50:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Всем доброго времени суток! Вот столкнулся с такой задачей, написал я триггер для одной из своих таблиц, а конкретно на вставку новой строки, суть в триггера в том, что он берет только что вставленную строку и получает сумму CRC32 из суммы MD5 этой строки, выглядит это примерно так
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Set @crc = CRC32(MD5(NEW.string));
  3. INSERT INTO table set crc = @crc;
  4.  

Но когда я делаю тоже самое средствами php(apache2) сумма CRC32 не совпадает. Я сначала подумал что дело в кодировке, то есть в их разнице, но я взял и выбрал все кодировки что есть в mysql и циклом проделал тоже самое с разной кодировкой, их у меня 39, но нет ни одного совпадения. В чем причина не могу понять. Может кто подскажет?
 
 Top
caballero
Отправлено: 19 Октября, 2012 - 17:00:50
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




crc по разному считается


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
dubasua
Отправлено: 19 Октября, 2012 - 17:07:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




А по подробнее можно...
 
 Top
EuGen Администратор
Отправлено: 19 Октября, 2012 - 17:35:14
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




dubasua пишет:
А по подробнее можно...

Суть в том, что в PHP стандартный целочисленный тип - знаковый. Это значит, что значение, возвращаемое CRC32, в нем изменяется в ином диапазоне (а именно от -231..231-1 для x32-систем).
Чтобы получить то же самое значение, что и в MySQL, в PHP нужно выполнять так:


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dubasua
Отправлено: 19 Октября, 2012 - 17:47:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Ого, даже не думал что могут быть такие расхождения, буду на работе проверю выше Вами написанное! Спасибо.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Октября, 2012 - 18:41:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




EuGen пишет:
для x32-систем

И вот на это мелкое уточнение хочу заострить отдельное внимание.
В догонку есть такой вот не баг: https://bugs.php.net/bug.php?id=51073


-----
PostgreSQL DBA
 
 Top
dubasua
Отправлено: 19 Октября, 2012 - 18:54:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Дык все равно не понял, как там получилось отрицательное число.
 
 Top
Мелкий Супермодератор
Отправлено: 19 Октября, 2012 - 19:08:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




dubasua, это-то как раз просто и идёт из сишных корней языка:
Всего дано 32 бита, и есть 2 варианта, как их отобразить - со знаком или без него (побитово они идентичны): Если со знаком, т.е. возможны отрицательные значения, - то старший бит показывает, положительное число или отрицательное, а само значение ограничено оставшимися 31 битами. А если беззнаковое - то число может занять все 32 бита, но тогда отсчёт от 0 до 2^32.
Так вот int'ы в PHP - только со знаком. Поэтому набор бит интерпретируется не совсем так. Аналогичная история с filesize для файлов размером от 2 до 4гб.


-----
PostgreSQL DBA
 
 Top
dubasua
Отправлено: 19 Октября, 2012 - 19:19:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Хм, это я хоть как-то но понял, и снова туман в голове, все это дело я испытывал на домашнем (локальном) серваке, а когда все перенес на удаленный сервак, там без не каких танцев с бубнами все работает, тоесть совпадения 100% как и в mysql. Получается что на удаленном серваке другой integer?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Октября, 2012 - 19:34:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




dubasua, скорей всего там *nix x64. Если это shared-хостинг, скорей всего так и есть.
А это - 64-битные целые, в знаковое представление которых - 63 бита под значение - 32 бита crc32 влезают с огромным запасом.


-----
PostgreSQL DBA
 
 Top
dubasua
Отправлено: 19 Октября, 2012 - 19:38:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Теперь все стало на свои места. Спасибо огромное, Вы круче чем GOOGLE или YANDEX
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB