2010-07-22 4 views
2

쿠키에 사용자 기본 설정을 저장해야합니다.쿠키에 큰 값을 저장하고 최적화하는 방법

  • 나는 세 개의 다중 선택 드롭 다운 &을 가지고 있습니다.
  • 사용자는 드롭 다운의 모든 값을 선택할 수 있습니다.

모든 고유 한 (8 자) 값을 쿠키에 저장하면 오버로드됩니다. 최소한의 값이 쿠키에 저장되도록 매핑을 수행하는 메커니즘이 필요합니다.

내 요구 사항은 this question과 일치하지만 차이점은 큰 데이터 세트 (선택 항목 당 100 개 항목)입니다.

+0

"[쿠키가 오버로드되었습니다"라는 의미는 무엇입니까? 쿠키에 저장해야 할 수도있는 4k 개 이상의 데이터 (단일 쿠키에 저장할 수있는 양)가 있습니까? 각 고유 값이 단지 8자인 경우, 이는 약 500 개의 값/기본 설정으로 하나의 쿠키에 저장할 수 있습니다. –

+0

여기에 설명 된 것과 같이 쿠키 당 허용되는 최대 문자 수는 아마도 다음과 같습니다. http://stackoverflow.com/questions/283774/maximum-number-of-cookies-allowed/283983#283983 – pr1001

+0

안녕하세요, 데이빗, 예, 이미 쿠키 다른 데이터도 있습니다. 따라서 사용자가 비트 마스크 제안을 위해 – jaan

답변

3

두 가지 가능성 :

A) 당신의 가치는 숫자 확인하고 2 (1,2,4,8,16 등의 권한) 및 비트 맵으로 쿠키에 단일 값을 저장합니다. (또는 서버 측 코드에서 고유 값을 2의 제곱으로 매핑하십시오.) B) 쿠키의 값을 구분 된 목록으로 저장하십시오. 업데이트

: 오후 6시 40분

것은 당신이 선택의 많은 가능성을 가지고보고, 내 원래의 솔루션도 작동 할 것이다. 엄청난 양의 데이터를 처리하기 위해 일종의 "세션 ID"를 만들거나 실제 설정을 데이터베이스 또는 다른 영구 저장소에 저장 한 다음 세션 ID를 쿠키에 저장해야 할 필요가 있다고 생각합니다.

(브라우저 세션 기간 동안 만 쿠키를 유지하고 브라우저 세션이 끝났음을 합리적으로 (예 : 1 주일 정도) 확인한 후에 저장된 설정을 삭제하려는 경우가 있습니다.

+0

+1에 약 300 개 이상의 고유 값이있는 드롭 다운의 모든 값을 선택하는 경우 약 31 개 또는 53 개보다 큰 목록에 문제가 발생할 수 있지만 [크기 제한 (http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-to)를 참조하십시오. –

+0

그래, 이제 300 가치의 가능성에 대한 의견을 보았고, 내 원래의 가능성 중 어느 것도 실용적이지는 않다. – ThatBlairGuy

1

선택한 항목의 색인을 저장할 수 있습니다.

A[0,2],B[3],C[0-9] 

당신은해야 할 것 : 사용자가 목록 A에서 항목 1과 3을 선택한 예를 들어, 목록 B 및 목록 C의 첫 번째 10 개 항목에서 항목 4, 당신이 뭔가를 얻을 것 값을 읽는 간단한 구문 분석 코드를 작성하십시오.

최악의 시나리오에서는 사용자가 홀수 또는 짝수 항목을 모두 선택하면 총 100 개의 항목을 포함하는 목록에 대해 약 150자를 필요로합니다. 사용자가 100 개의 항목을 모두 선택하면 A[0-99] 만 필요합니다.

+0

흠, 좋은 생각인데, 그것에 대해 생각해 봤으면 좋겠어. :-) –

+0

그래,하지만 사용자가 페이지를 가로 질러 움직일 때 선택 상자 옵션이 바뀔 수도 있고 몇가지 행동을 취할 수도있다. 내가 백 개가 있다면 다음에 80 개가있을거야. 값을 매핑해야합니다. – jaan

+0

예, 인덱스 대신 실제 옵션 값을 저장해야합니다. 이 경우 알파벳과 같은 다른 문자를 값으로 사용할 수도 있습니다. 그런 다음 더 많은 단일 문자 값을 가질 수 있으며 쿠키에 더 적은 문자가 필요합니다. –

2

좋은 질문입니다. 귀하의 요구 사항을 감안할 때 진행 방법에 대한 선택의 여지가 많지 않습니다. ThatBlairGuy가 제안했듯이, 비트 맵이가는 길일 것 같습니다. 300 가지 선택 사항이 300 비트로 변환됩니다. 이제는 저장 목적으로 base64로 빠르고 쉽게 변환하기 위해 개인적으로 바이트 당 6 비트만을 사용하도록 고수합니다. 드롭 다운에서 오는 값은 300/6 = 50 자입니다.

선호도 값은 하드 코딩해야하지만 중간에 제거하거나 추가 할 수는 없습니다. 비트 맵 끝에 새로운 환경 설정을 추가해야합니다. 더 이상지도의 어딘가에서 사용되지 않습니다.

편집 : 댓글을 다시 입력하십시오. 비트 맵에서는 구현을 위해 내가 염두에 두었던 것을 살려 낼 것입니다.각각의 특정 옵션 (드롭 박스의 항목)의 오프에 스위치에 해당하는 비트를 가정 :

this.bitmap = []; 
this.customBase64code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-"; 
... 
// index=index of bit within bit map, on=state of the bit 
this.setOption=function(index,on) { 
    var islot = Math.floor(index/6); 
    var ibit = index % 6; 
    if (this.bitmap[islot] === undefined) { 
     while (this.bitmap.length <= islot) { 
      this.bitmap.push(0); 
     } 
    } 
    if (on) { 
     this.bitmap[islot] |= (1 << ibit); 
    } 
    else { 
     this.bitmap[islot] &= ~(1 << ibit); 
    } 
}; 
this.getOption=function(index) { 
    var islot = Math.floor(index/6); 
    if (this.bitmap[islot] === undefined) { 
     return 0; 
     } 
    return this.bitmap[islot] & (1 << (index % 6)); 
}; 
this.getStringFromOptions=function() { 
    var bitmap64 = []; 
    var encoder64 = customBase64code.split(''); 
    var n = this.bitmap.length; 
    for (var i = 0; i < n; i++) { 
     bitmap64.push(encoder64[this.bitmap[i]]); 
    } 
    return bitmap64.join(''); 
}; 
this.getOptionsFromString=function(s) { 
    var bitmap64 = s.split(''); 
    var decoder64 = this.customBase64code; 
    var n = bitmap64.length; 
    for (var i = 0; i < n; i++) { 
     this.bitmap.push(decoder64.indexOf(bitmap64[i])); 
    } 
}; 

면책 조항 : 나는 위의 테스트를하지 않았다.

+0

+1은 base64입니다. 그것은 내가 생각하고있는 16 진수보다 많은 문자를 단일 문자에서 제외시킵니다. – ThatBlairGuy

+0

300 비트 정수형이 없으면 원래 값으로 다시 매핑하는 것이 모든 JavaScript 솔루션에서 여전히 성가 시지만 극복 할 수없는 것은 아닙니다. – ThatBlairGuy

+1

드롭 다운의 값을 base64 문자열의 인덱스와 지수의 지수의 조합으로 정의 할 수 있습니다. base64 문자열'NiC3'과 값'1_4'이 주어지면 인덱스 1의 base64 문자는 'i'가되고, 34로 매핑되고, 비트 플래그는 '1 << 4', 즉 16이됩니다. 비트와 & 연산자 값이 선택되면 34와 16의 값이 표시됩니다. 또한 드롭 다운 값을보다 유연하게 정렬 할 수 있습니다. 추신 : 내 호언 장담을 이해한다면 자유롭게 답을 추가하십시오 :) –

관련 문제