2011-03-13 5 views
2

자바 스크립트를 통해 캐싱 중입니다. 문자열 배열을 사용하고 처리 된 결과를 반환하는 메서드가 있습니다. 이 문자열에서 고유 한 ID를 만든 다음이를 결과를 저장하는 객체의 키로 사용하려고합니다. 이렇게하면 캐시의 키가 가능한 적은 메모리를 차지합니다.자바 스크립트에서 문자열 배열로부터 고유 한 ID를 만드시겠습니까?

본질적으로 나는 SHA1과 같은 것을 원하지만 javascript를 원한다.

어떻게하면 될 수 있습니까?

감사합니다.

답변

-1

아마이 :

var newDate = new Date; 
var uid = newDate.getTime(); 

나이 :

var uid = Math.random() * Math.pow(10, 17) + Math.random() * Math.pow(10, 17) + Math.random() * Math.pow(10, 17) + Math.random() * Math.pow(10, 17)); 

캐싱을 위해 자바 스크립트로 작업하기 때문에 거기에 고유 ID 가깝게 무언가를 얻기의 많은 방법이 있으며, 그것은 더 쉽게된다. 그것은 당신에게 가장 적합한 것을 선택하는 문제입니다.

+0

여러 명의 사용자 등이 중복 된 ID를 생성 할 가능성이 매우 높습니다. 좋은 해결책은 아닙니다. –

+0

나는 주어진 값과 동일한 id를 반환하기를 원한다. 따라서 Sha1에 대한 참조. –

+1

@Marc B : javascript는 공유되지 않으며 여러 사용자에게 문제가되지 않습니다. 또한 그 목적에 따라 다릅니다. – yoda

0

자바 스크립트에서 sha1을 원하십니까? 여기 ->http://pajhome.org.uk/crypt/md5/sha1.html

+0

그래, 이건 내가 피하고 싶었던거야. 이 코드는 매우 무거워 보입니다. 키를 사용하는 것보다 더 효율적이기 때문에 전체 문자열을 사용하는 것처럼 느껴집니다. –

1

해시를 사용하지 않으면 고유하고 작은 것을 얻지 못할 것입니다.

Doing myArray.join()은 고유하지만, 많은 양의 메모리를 소비 할 수 있으며 고유하지 않은 엣지 경우가 발생할 수 있습니다.

JavaScript에서 해시 알고리즘을 구현하는 것이 가장 좋습니다.

+0

기술적으로 문자열에 따라 'myArray.join()'은 유일성을 보장하지 않습니다. 예를 들어'[ 'a', 'b', 'c']. join() === [ 'a', 'b, c']. 문자열이 특정 형식으로되어 있다면 충분히 좋을 수도 있습니다 (그러나 그가 말한 것처럼 절약 할 공간이 없습니다). –

+0

@Matthew 예, 감사합니다. 나는 그것을 고려하지 않았습니다. 나는 갱신을 할 것이다. – alex

+0

이것은 내가 지금하고있는 일이다. 그리고 나는 충돌을 방지하는 데 도움이되는 토큰과 함께합니다. 하지만 당신이 말했듯이, 나는 5,000자를 넘는 결과를 얻는 경우가 있습니다. 과도한 키 길이처럼 보입니다. –

1

배열의 값의 성격에 따라, 귀하는 귀하의 경우에 적합하고 빠른 것을 요리 할 수 ​​있습니다. 충돌의 가능성과 그 결과에 대해 생각하는 것도 중요합니다. 당신은 어떤 종류를 사용하는 것이 좋습니다, 문자열의 연결은 "긴"것으로 예상되는 경우

  1. : 우리는 현재이 모든 정보를 가지고 있지 않기 때문에, 나는 일부 시작 지점부터 작업을 제공 할 수 있습니다 더 짧은 값을 반환하는 "해시". ,
  2. 당신은 아마 암호 강도 해시를 필요로하지 않기 때문에 MD5 또는 SHA1는
  3. 도 낮은 기술은, (length of string concat as int) + '/' + (number of strings as int) + '/' + (first char of each string) 같은 빠른 해시가 마지막으로 여러분의 기대 값

에 따라 잘 될 수 아마도 과잉이다 다음은 C#에서 이식 된 string.GetHashCode()의 구현입니다. .NET에 충분하다면 아마 충분할 것입니다.

var str = "concatenation of all array values"; 
var hash1 = (5381<<16) + 5381; 
var hash2 = hash1; 
var hashPos = 0; 
while(hashPos < str.length) { 
    hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27))^str.charCodeAt(hashPos); 
    if(hashPos == str.length - 1) { 
     break; 
    } 
    hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27))^str.charCodeAt(hashPos + 1); 
    hashPos += 2; 
} 

return hash1 + (hash2 * 1566083941); 
+0

확실히 흥미로운 솔루션입니다. 나는 이것을 발사하고 그것이 어떻게 작용 하는지를 볼 것이다. 나는 동의한다, 항상 사물이 충돌 할 작은 변화가 있지만, 캐시가 자바 스크립트를 통해 인스턴스 변수에 저장되고 각 사용자에 대해 독립적이고 각 요청에 대해 다시로드되기 때문에 매우 드물다. –

3

아쉽게도 배열의 전체 내용을 키로 사용하지 않으면 100 % 보장 된 고유성을 얻을 수있는 방법이 없습니다. 가장 좋은 암호화되지 않은 해시는 충돌을 해시 테이블에서 우수한 성능을 위해 허용되는 양으로 만 줄이지 만 여전히 전체 내용이 일치하는지 확인해야합니다.

SHA-1 또는 MD5와 같은 암호화 해시조차도 여전히 충돌이 발생할 수 있지만 대부분의 경우 거의 없습니다. 그게 충분하다면, 아마도 SHA-1과 함께 갈 것입니다. 그렇지 않으면 배열을 키로 사용하는 문자열로 변환하고 해시 및 충돌에 대해 JavaScript가 걱정하게합니다.어떤 경우

, 당신은 아마 성능을 거래하고 공간에 대한 가능성이 절대 정확성 (자바 스크립트가하는 네이티브 해싱은 자바 스크립트에 기록 할 수 있으며 무엇보다 훨씬 빠른 될 가능성이 높습니다).

간단한 결합이 고유하지 않을 수도 있으므로 (구분 기호 포함) 배열을 문자열로 변환하는 방법에 대해 해싱을 직접 수행하든 JavaScript에서 수행하든 관계없이주의해야합니다.

+0

+1 정확하고 유익한 정보. – alex

관련 문제