2017-03-24 26 views
0

4Dベクトルをbounded longに変換する方法を理解しようとしています。しかし、ベクトルとそれに伴う結果には一定の制限があります。ベクタ自体は4つの整数で構成されています。最初の整数は、Javaの機能内のものであれば何でもかまいません(Integer.MIN_VALUEからInteger.MAX_VALUEまで)。 2番目と4番目の整数は常に-2999984〜2999984(両端を含む)です。最後に、3番目の値は常に0から255の間です(ここでもまた両端を含む)。だから、それは以下のフォーマットに準拠します。4D VectorをLongに変換する

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

ベクトルが長い間-824629322721380016と824629339968358064.

に変換する必要があることを私は1対1のマッチングになり何も機能はおそらく存在しないことを承知していますしかし、私は可能な限り衝突を起こさない関数を見つけようとしています。

あなたが疑問に思っている場合、ベクトルとlongの境界は恣意的ではありません。私がMinecraftの投稿にタグを付けると、なぜその理由が説明されるべきですか。私はある次元の特定のblockposと別の次元のblockposを一致させようとしています。 4Dベクトルは[dimension id、x pos、y pos、z pos]であり、結果のlongはBlockPosの直列化形式(BlockPos#fromLong)です。あなたはthisフォーラムの投稿が私の質問を引き起こしたのを見ることができます。私はここで質問しています。なぜなら、私のクエストオンは必然的にMC特有であり、それは主に数学的でコードベースであるからです。

+0

この関数は簡単に元に戻す必要がありますか?それとも片方向にすることができますか? –

+0

いいえ、この機能は元に戻す必要はありません。上記の制限でベクトルがlongに変換されるのと同じくらいです。 – TheMasterGabriel

答えて

0

あなたの4dベクトルをビットに変換し、そのビット表現をBigIntegerにして、低衝突用に設計されたハッシュアルゴリズムを使ってその整数をハッシュすることをお勧めします。

あなたのバケットの数は事実上ロングの範囲です。このMurmur2による

番号のための最高のハッシュ: https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

あなたできるGoogle Murmur2用のJava実装のように見えますが、ここではこの答えの執筆時点ではその一例です。 https://github.com/sangupta/murmur

あなたの次元数を65536(16ビット)に制限できる場合は、ビットだけに1対1のハッシュを付けることができます。おそらくユーザーが入ることができる仮想世界の数を制限することによってこれを行うことができますか?

0

残念ながら、これはできません。ロングは64ビットしか保持しませんが、あなたの4D-Vectorは32 + 23 + 8 + 23> 64を必要とします。

入力を少ししか制限しないと、次のコードのように変換できます(2D-int-Vectorの例 - > long変換)

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; 
} 
関連する問題