2010-03-23 2 views
10

많은 제 3 자 서식있는 텍스트 편집기 중 하나를 사용하여 편집 한 대량의 콘텐츠 (예 : 블로그 용 기사)를 포함 할 수있는 텍스트 영역이있는 양식이 있습니다. 자동 저장 기능과 같은 것을 구현하려고합니다. 변경된 경우 아약스를 통해 콘텐츠를 제출해야합니다. 그러나 옵션으로 가지고있는 편집자 중 일부는 "isdirty"플래그 또는 마지막 저장 이후 내용이 변경되었는지 확인할 수있는 "onchange"이벤트를 지원하지 않는다는 사실을 해결해야합니다.JavaScript의 큰 문자열과 해시 비교

그래서 임시 해결 방법으로, 마지막 저장 시점에서 변수의 복사본을 보관하고 (lastSaveContent이라고 부름) 현재 텍스트와 비교합니다. 자동 저장 (autosave) "기능이 (타이머에서) 실행되어 다른지 확인합니다. 그러나, 나는 매우 큰 문서를 가지고 갈 수있는 메모리의 양에 대해 걱정하고있다.

전체 문자열 대신 lastSaveContent 변수에 일종의 해시를 저장 한 다음 해시 값을 비교하는 것이 더 효율적입니까? 그렇다면이 요구 사항에 적합한 해시를 구현하는 jQuery 플러그인 또는 jQuery 플러그인을 사용하는 것이 좋습니다.

+0

아마도 당신의 유스 케이스에서는 거의 발생하지 않을 것입니다. 그러나 자바 스크립트와 해시를 검색 할 때 여기에 도착하는 캐주얼 리더의 경우 두 해시 값을 비교하는 것이 중요하지 않습니다. 두 문자열을 비교할 때와 마찬가지로 해시가 충돌 할 수도 있고 두 개의 다른 문자열에 대해 같은 해시가 충돌 할 수도 있습니다. 따라서 많은 경우에 동일한 해시 값을 얻는다면 전체 비교를 수행해야합니다. –

+0

좋은 지적. 또한 독자가 궁금해하는 경우 많은 컬렉션 API에서 발견되는 것과 같은 Hashtable 객체가 두 개의 키가 동일한 해시를 생성 할 때 이러한 충돌을 처리하는 기능을 포함하기 때문에 여전히 작동합니다. – user4815162342

답변

19

간단히 말해 두 문자열을 저장하고 비교하는 것이 좋습니다.


적절한 해시를 계산하는 것은 하지 저렴합니다. 예를 들어 문자열의 MD5 해시를 계산하려면 pseudo code 또는 actual JavaScript implementation을 확인하십시오. 또한 모든 해시 구현은 문자열의 문자를 열거해야합니다.

또한, 현대 컴퓨팅의 맥락에서, 문자열 정말, 정말 길이가 다른 문자열에 대해 그것을 비교하기 전에 느린이어야한다. 여기에서하는 일은 실제로 마이크로 최적화입니다. 메모리는 문제가되지 않으며 두 문자열을 비교하기 위해 CPU가 순환하지 않습니다. 최적화의 모든 경우와 마찬가지로

: 확인 당신이 그것을 해결하기 전에이 실제로 문제가. 빠른 테스트에서 MD5 합계를 계산하고 비교하는 데 382ms가 걸렸습니다. 두 문자열을 직접 비교하는 데는 0ms가 걸렸습니다. 이것은 10000 단어 길이의 문자열을 사용하고있었습니다. http://jsfiddle.net/DjM8S을 참조하십시오.

정말로이 문제로 보인다고해도 나는 가난한 사람 비교를 사용하는 것이 좋습니다. 실제 문자열 비교보다는 변경 여부를 확인하기 위해 2 개의 문자열의 길이를 비교하는 것입니다.

..

+0

좋아, 사용자가 대신 소설 장을 게시하고 싶다고 가정 해 보겠습니다. 기사는 얼마나 오래 "성경의 거대한 추출물"의 길이를 고려해야 할 것인가? – user4815162342

+2

문자열을 MD5 '처리 한 다음 "이전"MD5 합과 비교하는 데 382ms가 걸립니다. 기본 문자열 비교에는 0ms가 걸립니다. 이것은 ~ 10000 단어 길이의 문자열을 사용하고 있습니다. (http://www.jsfiddle.net/DjM8S/) – Matt

+0

감사합니다. 이것은 두 가지의 더 나은 대답과 내가 찾고 있었던 답변입니다 (다른 답변도 유익합니다). 나는 그것을 투표 할 것이지만 분명히 새로운 사용자로서 나는 충분한 명성을 얻지 못했다. – user4815162342

4

MD5 해시는 파일이나 문서의 무결성을 확인하는 데 자주 사용됩니다. 그것은 당신의 목적을 위해 작동해야합니다. Here은 Javascript에서 MD5 해시를 생성하는 좋은 방법입니다.

+0

유용한 정보이지만, 다른 답변이 제안한 것처럼이 작업을 귀찮게 할 필요가 없다면 유지 관리해야 할 코드가 조금 적습니다. – user4815162342

1

성능 측정을 위해 여기서 유용한 JSperf를 만들었습니다. 제가 만든 것과 다른 개정과 다른 유형의 수표를 추가하십시오!

http://jsperf.com/long-string-comparison/2

제가 발견 두 가지 결과

  • 문자열이 동일한 성능 살해하는 경우; 에서 ~ 9,000,000 작전/s의 IE9의 64 비트 버전은 내 PC에 많은 느린
  • 에 ~ 250 개 작전/초 (크롬), 동일한 시험 결과 : 슬프게도

    +------------+------------+ 
    | IE9 64bit | IE9 32bit | 
    +------------+------------+ 
    | 4,270,414 | 8,667,472 | 
    | 2,270,234 | 8,682,461 | 
    +------------+------------+ 
    

jsperf는 두 결과를 단순히 "IE 9"로 기록했습니다.

JS MD5 성능의 초기 모습조차도 매우 느립니다 (적어도 대형 문자열의 경우, http://jsperf.com/md5-shootout/18 - 최대 70 ops/초 참조). 나는 AJAXing 해시 계산이나 백엔드 비교를 시도하기를 원하지만 테스트 할 시간이 없다. 미안하다.

+0

그리고 http://stackoverflow.com/a/10542872/694325. – Nenotlep