2012-03-21 5 views
1

WWW 프레임 워크에서 API 호출을 많이 캐싱하고 버퍼링하는 것을 사용하고 있으며, 핑거 프린팅 (fingerprinting) '데이터를 사용하여 캐시 파일 이름을 일치시키고 이미 만들어진 API 호출을 탐지합니다.배열 지문 채취를위한 가장 빠른 방법 (데이터 배열에서 고유 한 해시 계산)

많은 데이터가 GET, POST 등과 같이 배열로 이동됩니다. 결과적으로 API 호출의 고유성은 데이터에 따라 다릅니다.

결과적으로이 정보를 지문 채취해야합니다. 그렇게하려면 데이터 배열에서도 '지문'을 생성해야하며이를 저장하고 비교할 수있는 문자열로 해싱해야합니다.

배열 직렬화의 경우 PHP에서 serialize() 및 json_encode()가 있습니다. 다양한 벤치 마크 이후에 나는 json_encode()를 배열을 직렬화하는 더 빠른 방법이라고 생각하고 꽤 만족한다.

해시에는 md5() 및 sha1() 함수가 있으며, 그 중 md5()는 내 벤치 마크에 따라 더 빠릅니다.

$fingerprint=md5(json_encode($array)); 

그러나 나는이 PHP에서 배열을 지문에 대한 '가장 빠른'방법인지 의문을 데 :

그래서 내 현재의 지문 알고리즘이다. 나는 Google과 StackOverflow를 시도했지만 좋은 대안을 찾지 못했다. 올바른 길을 가고 있습니까? 아니면 다른 것을해야합니까?

+1

'md5 (var_export ($ data, true)) '는 어떻게 비교됩니까? 또한'json_encode'에 의해 보존 될 순서에 의존 할 수 있는지 궁금합니다. 키 순서가 다르기 때문에 캐시를 놓치는 것이 좋지 않습니다. – Hamish

+2

var_export()는 serialize()보다 빠르지 만 테스트 결과에 따라 json_encode()보다 느립니다. mc5()를 대체하기 위해 crc32()를 찾고 있습니다. 테스트해야합니다. – kingmaple

+0

음, 분명히 (놀랍게도) crc32()는 실제로 md5()보다 느리고 물론 충돌 가능성이 더 큽니다. 그래서 나는 md5 (json_encode ($ array))에서 이전 위치로 되돌아 간다. – kingmaple

답변

3

일단 배열 json_encoded을 얻었 으면 속도에 주로 관심이있는 경우 비 cyrptographic 해시 함수를 사용해야합니다. 다른 해쉬 함수는 다른 것들을 위해서 좋다. MD5와 Sha1은 해독하기가 어렵 기 때문에 암호화라고 부릅니다 (취약성 때문에 보안 목적으로 널리 사용되지 않는 것으로 간주됩니다). CRC (Cyclic Redundancy Check) 기능은 오류 감지 코드이며 어쨌든 고유성에 적합하지 않습니다.

위키피디아는 일반적으로 거기에 기고 한 것이 일반적으로 라이브러리 구현에 대한 외부 링크를 가지고 있기 때문에 시작하기에 알맞은 곳입니다. List of hash functions 비 암호화 라이브러리를 읽고 벤치마킹하는 것이 좋습니다. 비 암호화 기능은 속도와 합리적인 수준의 독창성, 보안, 오류 탐지 및 기타 흥미로운 속성을 희생하기 위해 작성되었습니다.

당신이 주로 속도에 대해 염려하는 경우 고려해야 할 마지막 사항은 지문 자체를 저장하고 비교하는 방법입니다. MD5는 128 비트의 데이터를 출력하는데, 이는 라이브러리 호출과 오버 헤드를 추가하지 않고 PHP의 숫자 형식에 맞지 않습니다. 내 돈을 위해, 당신이 비교할 수있는 최고의 속도를 얻을 수 있고 저장 장치가 64 비트 숫자를 직접 출력 할 수있는 해시 함수에서 올 것이라고 확신합니다. PHP에서 기본적으로 64 개의 숫자를 얻으려면 64 비트 하드웨어가 있어야하며 64 비트 모드로 PHP를 구성/설치해야합니다. 여기 어딘가에서 내가 준비하고 테스트 한 환경을 테스트 할 때 사용했던 코드가 있습니다. 관심이 있다면 아마 발굴 할 수 있습니다.

Btw, 나는 json-encode보다 배열의 빠른 문자열 화를 얻지 못할 것이라고 생각합니다. 이 문제의 핵심은 배열 보행과 문자열 조작입니다. 따라서 본질적으로 속도는 출력의 자세한 정보에 비례합니다. JSON-encode는 php의 serialize 또는 export 함수에 비해 매우 간결합니다. 나는 PHP 문서 페이지에 대한 충분한 의견을 보았다면 배열을 입력으로 직접 사용하는 해시 함수를 작성한 사람을 찾을 수는 있었지만 그것이 전혀 좋았는지 도박이 될 수 있습니다.

언제든지 궁금한 것이 있습니다.

+0

최상의 답변은 아니지만 상황을 고려해 볼 때 충분합니다. 당신의 도움을 주셔서 감사합니다! – kingmaple

+3

여기에 고유성이있는 상황 중 하나가 최선의 답이라고 말하고 싶습니다. – tiwo