태그 : php


ActionScript와 PHP의 배열 정렬 함수의 차이.

현재 프로젝트는 클라이언트를 전부 플래시화하여 진행 하고 있다.
단순히 데이터를 웹서버에서 읽어서 처리하는 것이라면 크게 문제가 없는데, 플래시에서 웹서버로 데이터를 전송할 때 위변조의 여부를 판단하기 위해 해쉬코드를 도입했다.

해쉬코드는 파라미터를 정렬한 결과에 대해서 처리하고 있는데, 
문제는 정렬 함수가 ActionScript와 PHP가 내부적으로 조금 차이가 있어 해쉬코드가 일치하지 않는 것이었다.

예를 들어 다음과 같은 파라미터가 있다고 하자. PHP는 변수 앞에 "$"가 있다고 생각하자.
a[0] = "3";
a[1] = "10";
a[2] = "neojjang.egloos.com";
a[3] = "hello!";


ActionScript에서 정렬한 결과를 확인 해 보면
a.sort();
a[0] = "10";
a[1] = "3";
a[2] = "hello!";
a[3] = "neojjang.egloos.com";

결과를 얻는다.

그럼 PHP의 결과를 확인 해 보자.
sort($a);
$a[0] = "3";
$a[1] = "10";
$a[2] = "hello!";
$a[3] = "neojjang.egloos.com";


배열의 정렬 결과가 다르다. 이상태에서 해쉬코드가 다른 것은 당연지사.

내부 플래시팀의 의견은 위와같이 문자열과 숫자가 섞인 배열의 플래시에서 정렬은 모두 문자열로 취급하기 때문이라고 한다. 따라서 "3", "10"을 정렬하면 "10","3"의 순서가 되는 것이다. 반대로 PHP는 옵션이 없다면 각 배열 값의 기본 타입을 기준으로 정렬을 하기 때문에 원하는(?)대로 결과를 얻게 된다.

이 문제는  ActionScript의 정렬 방식을 PHP에서 따라가는 것으로 해결, 조치를 했다.
PHP에서 정렬할 때 옵션으로 "SORT_STRING"을 2번째 파라미터로 전달해 주면 ActionScript와 같은 정렬 결과를 얻을 수 있다.

sort($a, SORT_STRING);
$a[0] = "10";
$a[1] = "3";
$a[2] = "hello!";
$a[3] = "neojjang.egloos.com";


sort의 자세한 내용은 reference를 참고.

언어 사이에 데이터를 주고 받을 때, 이런 미묘한 차이가 문제를 일으키면 찾기 힘든 경우가 종종 있다.
어쨌든 무사히 해결.

by 연서아빠 | 2009/07/16 14:13 | 자료 | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶