优化代码,性能暴涨

This commit is contained in:
Administrator
2025-01-29 14:01:11 +08:00
parent e243203535
commit 6de65562be
130 changed files with 9138 additions and 1020 deletions
@@ -0,0 +1,93 @@
package org.kne.cloud.network.ipv6;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Objects;
public class Inet6AddressGroup implements Comparable<Inet6AddressGroup>{
private static final byte[][] maskTransf=new byte[129][16];
static {
for (int i = 0; i < 129; i++) {
for(int j=0;j<i;j++) {
maskTransf[i][j/8]=(byte) (((0b10000000)>>>j%8)|maskTransf[i][j/8]);
}
}
/* for (int i = 0; i < maskTransf.length; i++) {
try {
System.out.println(InetAddress.getByAddress(maskTransf[i]));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}*/
}
public Inet6AddressGroup(Inet6Address address) {
this(address, 128);
}
@Override
public String toString() {
return address.getHostAddress()+"/"+prefixLength;
}
@Override
public int hashCode() {
return Objects.hash(address, prefixLength);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Inet6AddressGroup other = (Inet6AddressGroup) obj;
return Objects.equals(address, other.address) && prefixLength == other.prefixLength;
}
public Inet6AddressGroup(Inet6Address address, int prefixLength) {
super();
this.address = address;
this.prefixLength = prefixLength;
}
public Inet6AddressGroup(DataInputStream in) throws IOException {
readFromStream(in);
}
private Inet6Address address;
private int prefixLength=128;
public Inet6Address getAddress() {
return address;
}
public int getPrefixLength() {
return prefixLength;
}
public boolean checkMatch(Inet6Address ia) {
byte[]mask=maskTransf[prefixLength];
byte[]andj=and0(mask,ia.getAddress());
byte[]andm=and0(mask ,address.getAddress());
return Arrays.equals(andj,andm);
}
private byte[] and0(byte[] bs, byte[] address2) {
byte[]rez=new byte[bs.length];
for (int i = 0; i < rez.length; i++) {
rez[i]=(byte) (bs[i]&address2[i]);
}
return rez;
}
@Override
public int compareTo(Inet6AddressGroup o) {
return -Integer.compare(prefixLength, o.prefixLength);
}
public void writeToStream(DataOutputStream out) throws IOException {
out.write(address.getAddress());
out.write(prefixLength);
}
public void readFromStream(DataInputStream in) throws IOException {
byte[]b=new byte[16];
in.readFully(b);
address=(Inet6Address) Inet6Address.getByAddress(b);
prefixLength=in.read();
}
}