Приветствую всех.
Ситуация такова:
Есть клиент-серверная игрушка, на сервере - PHP.
Логика обмена данными между ними такая:
Клиент отправляет запрос, к которому дописывается еще один параметр - сигнатура запроса, sign (md5-хэш запроса).
На сервере выбираются все параметры, кроме sign, вычисляется их md5-хэш и сравнивается с параметром sign, пришедший с клиента. Если идентичны - все гуд, работаем, а если нет - отсылаем.
И вот тут появляется проблема: на Флаше, при добавлении параметров к запросу через URLVariables, они почему-то случайным образом сортируются. А их md5 хэш вычисляется по строке параметров, которая была образована до разбивания ее в объект URLVariables.
Поясню.
Например, у меня есть вот такой запрос:
commandID=loadData&userId=" + Main.userId + "&mode=" + Main.userMode
Код отправки запроса:

Код AS3:
/**
* Метод выполняет отправку запроса на сервер.
* @param _query Строка запроса.
* @param _completeEventHandler Обработчик события успешного выполнения запроса.
* @param _ioErrorEventHandler Обработчик события появления ошибки при выполнении запроса.
*/
public static function sendQuery(_query:String, _completeEventHandler:Function = null, _ioErrorEventHandler:Function = null):void
{
var urlLoader:URLLoader = new URLLoader();
var variables:URLVariables = new URLVariables();
var request:URLRequest = new URLRequest(sScriptURL);
var paramPairs:Array = _query.split(/[&=]/);
for(var i:int = 0; i < paramPairs.length; i += 2)
{
variables[paramPairs[i]] = paramPairs[i + 1];
}
if(bUseSignature)
{
variables["sign"] = MD5.encrypt(_query);
}
request.data = variables;
request.method = URLRequestMethod.POST;
if(_completeEventHandler != null)
{
urlLoader.addEventListener(Event.COMPLETE, _completeEventHandler, false, 0, true);
urlLoader.addEventListener(Event.COMPLETE, onPHPResponse, false, 0, true);
}
if(_ioErrorEventHandler != null)
{
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, _ioErrorEventHandler, false, 0, true);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onPHPResponseError, false, 0, true);
}
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.load(request);
}
И код проверки подписи на сервере:

PHP код:
/**
* Функция выполняет проверку подписи запроса.
*/
function checkSignature()
{
$queryStr = "";
foreach($_POST as $key => $value)
{
if($key == "sign") continue;
$queryStr .= "&$key=$value";
}
$queryStr = substr($queryStr, 1);
return strcmp($_POST['sign'], md5($queryStr . QUERY_ADDITIONAL_SIGN_PART)) == 0;
}
Соответственно, подписи запроса совпадают только в том случае, если параметры после добавления в объект URLVariables идут по очереди так-же, как и в самой строке запроса.
Отсюда вопрос - как от этой произвольной сортировки в объектах избавиться?
Заранее спасибо за ответы
