确保对严格正多头的 XOR 运算仅产生严格正多头
Ensuring that an XOR operation on strictly positive longs only yield strictly positive longs
我想确保对严格正多头的 XOR 运算只产生严格正多头。
我的问题基于以下 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);
}
}
任何人都可以提供一些理论的答案吗?
不变量 1:正整数的最高有效位为零。
不变量 2:0 XOR 0 = 0.
结论:正整数XOR正整数=正整数。
鉴于 Java 中的多头总是有符号的,您应该确保 "password" 中的每个 long
永远不会切换符号位。
也就是说,您 password
中的所有 long
都应该像 0b0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
。
这会稍微削弱 "encryption"(确实),但您不必为此担心太多。
但是应该注意,除非你想比较它们是否大于 0,否则没有理由这样做;实际数字将始终相同,即 0xff
或 0b11111111
始终相同,只是其十进制表示根据您使用无符号或有符号短整数来存储它而改变(255
和 -1
。
我想确保对严格正多头的 XOR 运算只产生严格正多头。
我的问题基于以下 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);
}
}
任何人都可以提供一些理论的答案吗?
不变量 1:正整数的最高有效位为零。
不变量 2:0 XOR 0 = 0.
结论:正整数XOR正整数=正整数。
鉴于 Java 中的多头总是有符号的,您应该确保 "password" 中的每个 long
永远不会切换符号位。
也就是说,您 password
中的所有 long
都应该像 0b0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
。
这会稍微削弱 "encryption"(确实),但您不必为此担心太多。
但是应该注意,除非你想比较它们是否大于 0,否则没有理由这样做;实际数字将始终相同,即 0xff
或 0b11111111
始终相同,只是其十进制表示根据您使用无符号或有符号短整数来存储它而改变(255
和 -1
。