0

厳密に正の long に対する XOR 演算で、厳密に正の long のみが生成されるようにしたいと考えています。

私の質問は、次の Java コードに基づいています。

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Random;

public class Test {

    static Random r = new Random();

    static class Data {
        long id = Math.abs(r.nextLong());

        @Override
        public String toString() {
            return "Data {" + "id=" + id + '}';
        }
    }

    public static void main(String[] args) {
        List<Data> data = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            data.add(new Data());
        }

        final String password = "don't you ever tell them";

        byte[] passwordBytes = password.getBytes();
        long[] passwordLongs = new long[passwordBytes.length / 8];

        for (int i = 0; i < passwordLongs.length; i++) {
            ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
            byte[] chunk = new byte[Long.BYTES];
            System.arraycopy(passwordBytes, i * Long.BYTES, chunk, 0, Long.BYTES);
            buffer.put(chunk);
            buffer.flip();//need flip
            passwordLongs[i] = buffer.getLong();
        }

        System.out.println(data);

        ListIterator<Data> encryptIterator = data.listIterator();
        while (encryptIterator.hasNext()) {
            Data next = encryptIterator.next();
            next.id = next.id ^ passwordLongs[(encryptIterator.nextIndex() - 1) % passwordLongs.length];//XOR here
        }

        System.out.println(data);
    }
}

誰かがおそらくいくつかの理論で答えを提供できますか?

4

2 に答える 2

2
  • 不変条件 1: 正の整数の最上位ビットはゼロです。

  • 不変条件 2: 0 XOR 0 = 0。

結論: 正の整数 XOR 正の整数 = 正の整数。

于 2015-10-04T09:15:56.677 に答える
1

Java の long は常に署名されているためlong、「パスワード」のすべてが符号ビットを切り替えないようにする必要があります。

つまり、あなたlongの はすべて のpasswordようになるはずです0b0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

これは「暗号化」を (正確に) 少し弱めますが、これについてはあまり心配する必要はありません。

ただし、それらが 0 より大きいかどうかを比較したい場合を除き、これを行う理由はないことに注意してください。実際の数値は常に同じです。つまり、0xff常に同じです。0b11111111格納するために符号なしまたは符号付き短整数を使用しているかどうかに応じて、その 10 進数表現のみが変わります (255および-1それぞれ)。

于 2015-10-04T09:23:21.400 に答える