2017-03-24 9 views
0

4D 벡터를 제한 길이로 변환하는 방법을 알아 내려고하고 있습니다. 그러나 벡터와 결과로 나오는 길이에는 제한이 있습니다. 벡터 자체는 4 개의 정수로 구성됩니다. 첫 번째 정수는 Java의 기능 내에서 사용할 수 있습니다 (Integer.MIN_VALUE부터 Integer.MAX_VALUE까지). 두 번째 및 네 번째 정수는 항상 -2999984에서 2999984 사이에 포함됩니다. 마지막으로 세 번째 값은 항상 0에서 255 사이입니다 (다시 말하지만 둘 다 포함).4D 벡터를 Long으로 변환

([Integer min - Integer max], [-2999984 - 2999984], [0 - 255], [-2999984 - 2999984]) 

벡터 오래 내가 알고 있어요

-824629322721380016 사이 824629339968358064.로 변환 할 필요가있는 1-1 일치하는 결과 함수가 아마이 없음 : 그래서 다음 형식을 따릅니다 ,하지만 가능한 한 충돌을 최소화 할 수있는 함수를 찾으려고합니다.

궁금한 점이 있다면 벡터와 긴 경계는 임의적이지 않습니다. 내가 Minecraft로 포스트에 태그를 붙이자, 나는 이유를 설명해야한다. 하나의 차원에서 특정 blockpos를 다른 blockpos와 일치 시키려고합니다. 4D 벡터는 [차원 id, x pos, y pos, z pos]이고 결과 long은 BlockPos (BlockPos # fromLong)의 직렬화 된 형식입니다. 내 문의 사항을 촉발시킨 this 포럼 게시물을 볼 수 있습니다. 내 queston 반드시 MC 특정 있기 때문에 그것은 주로 수학 및 코드 기반으로 여기에서 부탁 해요.

+0

이 기능을 쉽게 되돌릴 수 있어야합니까? 또는 그것은 편도 일 수 있는가? –

+0

아니요, 기능을 되돌릴 필요가 없습니다. 위의 제한 사항으로 벡터가 long으로 변환되는 한. – TheMasterGabriel

답변

0

4d 벡터를 비트로 변환하여 비트 표현을 BigInteger로 만들고 낮은 충돌을 위해 설계된 해시 알고리즘을 사용하여 해당 정수를 해싱하는 것이 좋습니다.

귀하의 '버킷'수는 실질적으로 긴 범위입니다. 이 Murmur2에 따르면

번호에 가장 적합한 해시 : https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

할 수 있습니다 구글 Murmur2에 대한 자바 구현 것으로 보인다, 그러나 여기이 답변의 글을 쓰는 시점에서 하나의 예입니다 https://github.com/sangupta/murmur

너의 차원의 수를 65536 (16 비트)로 제한 할 수 있다면 너는 비트에 대해서 1에서 1의 해시를 가질 수있다. 아마도 사용자가 들어갈 수있는 가상 세계의 수를 제한함으로써이를 수행 할 수 있습니까?

0

불행히도이 작업을 수행 할 수 없습니다. long은 64 비트 만 보유하지만 4D-Vector는 32 + 23 + 8 + 23> 64가 필요합니다.

입력을 조금만 제한하면 다음 코드와 같이 변환 할 수 있습니다. (2D-int-Vector <의 예 - 긴 변환) :

long toLong(int int1, int int2) { 
    return ((long) int1 << 32) | (int2 & (-1L >>> 32)); 
} 

int[] toInts(long l) { 
    int[] ints = new int[2]; 
    int[0] = (int) (both >> 32); 
    int[1] = (int) both; 
    return ints; 
}