2011-09-07 4 views
1

나는 PHP를 사용하여 웹 사이트를 개조하고있다. 내 프로세스의 일부는 이미지 경로가 존재하지 않는 이미지를 가리 키지 않는지 (즉, 깨진 이미지가 없는지) 확인하는 것입니다. 많은 페이지가 특정 이미지를 공유하기 때문에 캐시 배열을 설정하여 주어진 경로에 대한 이미지 파일의 존재 여부를 이미 확인했는지 확인합니다.경로 캐싱을위한 빠른, 충돌없는 해시 알고리즘?

원시 경로 문자열을 배열 색인으로 사용하면 작동하지 않으므로 md5()을 사용하면 트릭을 수행합니다. 그러나 변환 스크립트는 오랜 시간이 걸리고 md5 계산으로 인해 분명하게 보입니다 (저는 지난 며칠간 자주 변환을 실행 해 왔으며 즉시 캐싱이 작동하기 시작하자마자 스크립트를 실행하는 데 훨씬 오래 걸렸습니다.)

그래서 캐시에 사용할 수있는 빠른 해시 알고리즘이 있는지 궁금합니다. 물론 충돌을 일으키지 않는 알고리즘이 필요합니다. 이 스크립트는 일회성 스크립트이기 때문에 보안 성이 뛰어나고 깨지지 않는 알고리즘이 필요하지 않습니다. 단 하나의 작업 만 수행하면됩니다.

This comment 분명히 php가 사용할 수있는 모든 해싱 함수 목록입니다.

편집 편집 내 의견에 많은 관심을 끌지는 않았지만 캐시 배열의 인덱스로 일반 문자열 경로를 사용하면 작동하지 않습니다. md5 해시로 변경하자 마자 작동했습니다. 더 많은 시간을 할애하여 문제를 해결할 수는 있지만 일회성 프로젝트이므로 절대적으로 필요한 것보다 많은 시간을 할애 할 수 없습니다.

게시물 편집 좋아, 분명히 내 캐싱에 잘못된 방식으로하고 있습니다. 인덱스를 해시에 관계없이 캐시가 작동하기 시작한 해시로 변경했을 때 뭔가 변경되었을 것입니다. 사람들은 내 해시가 파일 경로 문자열에 괜찮을 것이라고 말하고 있으며, md5s는 그 길은 오래 걸리지 않습니다. 그래서, 내가 뭘 잘못하고 있는지 모르겠다. 그리고 나는이 프로젝트에서 그것을 이해할 시간이 없다. 나는이 질문을 삭제할 것이지만 이미 답변을 가지고있다.

+3

충돌없는 해시는 없습니다. 해싱은 기본적으로 무한한 수의 입력을 가져 와서 제한된 수의 출력으로 매핑하는 것을 포함합니다.유한 데이터 세트 (물론 크기> 1)에서도 해시 알고리즘이 실제로 모든 데이터를 해싱하고 충돌을 확인하지 않고 충돌을 피할 수있는 방법은 없습니다. –

+1

MD5가 너무 느리면 뭔가 잘못되었습니다. 지난 5 년 동안 구축 된 모든 기계는 초당 수백만 개의 경로를 해싱 할 수 있어야합니다. 배열을 관리하는 방식에 대한 어떤 것이 느릴 가능성이 훨씬 더 높습니다. 문제는 단순히 MD5가 될 수 없습니다. – meagar

+0

@Michael Madsen 그냥 충돌이 없어야합니다 * 충분합니다. – user151841

답변

4

이러한 해시가 PHP 내부에서만 사용되며이 스크립트가 작동 할 때 동적으로 빌드되는 경우 단순히 배열을 사용하지 않는 이유는 무엇입니까?

if (isset($path_cache['/some/weird/ugly/long/path'])) { 
    ... 
} 

도 MD5 계산 오버 헤드없이 잘 작동합니다.

+0

나는 더 많은 시간이 있었는지 두 번 확인하고 싶지만 배열 인덱스가 원시 질문 (나는 내 ​​질문에 명시된)으로 작동하지 않았다. 해시 된 문자열을 인덱스로 사용할 때 작동했습니다. – user151841

+0

어떻게 작동하지 않습니까? PHP는 키로 사용되는 문자열이 경로이거나 md5 해시 인 경우 덜주의 할 수 없습니다. 둘 다 그냥 문자열입니다. –

+0

다음은 어떻게 작동하지 않는가입니다 : 캐시 배열에서 값을 가져 왔을 때 메시지를 내 보내도록 설정했습니다. 캐시가 경로로 가득차 있지만 지난 주 동안 나는 메시지를 보지 못했습니다. 색인을 해시로 변경했는데 갑자기 거의 모든 것이 캐시에서 빠져 나오고 있습니다. 불행히도 내가 뭘 잘못하고 있는지 알아낼 시간이 없다 : P – user151841

1

일반 경로를 사용하는 것이 좋습니다. 해시 할 필요가 없습니다. 그러나 crc32은 빠른 것 같습니다. 명심하십시오 - 당신은 속도를 내기 위해 충돌 속도를 희생합니다.

0

가장 빠른 해시 함수는

hash('adler32', $string); 

그러나 단지 md5() 위의 함수로 거의 빨리 작동하는 것으로 보인다.

PHP에서 사용할 수있는 모든 해시 중 벤치 마크가 있습니다.
http://l.garygolden.me/fastest-hash-php

1
foreach (hash_algos() as $value) { 
    print hash($value, 'some random') . ' - ' . $value . '<br />'; 
} 

그것은 지원하는 PHP는 모든 해싱 알고리즘에 해시 문자열을 인쇄합니다.