tengo una solución para cuando las direcciones se almacenan como cadenas. Entonces, si desea hacer esa parte de su algoritmo, puede usar mi solución aquí.
Es un poco complicado, especialmente para IPv6. En IPv6 opcionalmente puede haber segmentos comprimidos, como 1 :: 1 que es equivalente a 1: 0: 0: 0: 0: 0: 0: 1, que es la razón principal por la que es complicado.
The IPAddress Java library producirá mysql SQL para buscar direcciones en una subred determinada. El enlace describe este problema con más detalle. Descargo de responsabilidad: soy el gerente del proyecto.
El algoritmo básico es tomar la sección de red de la dirección de subred, luego tomar cada variante de esa sección (por ejemplo, las dos cadenas anteriores son variantes de la dirección completa 1 :: 1), luego contar el número de segmento separadores, luego haga una subcadena mysql en la dirección que coincida, pero también cuente los separadores totales en la dirección que coincida.
Aquí es código de ejemplo:
public static void main(String[] args) throws IPAddressStringException {
System.out.println(getSearchSQL("columnX", "1.2.3.4/16"));
System.out.println(getSearchSQL("columnX", "1:2:3:4:5:6:7:8/64"));
System.out.println(getSearchSQL("columnX", "1::8/64"));
}
static String getSearchSQL(String expression, String ipAddressStr) throws IPAddressStringException {
IPAddressString ipAddressString = new IPAddressString(ipAddressStr);
IPAddress ipAddress = ipAddressString.toAddress();
IPAddressSection networkPrefix = ipAddress.getNetworkSection(ipAddress.getNetworkPrefixLength(), false);
StringBuilder sql = new StringBuilder("Select rows from table where ");
networkPrefix.getStartsWithSQLClause(sql, expression);
return sql.toString();
}
ouptut:
Select rows from table where (substring_index(columnX,'.',2) = '1.2')
Select rows from table where (substring_index(columnX,':',4) = '1:2:3:4')
Select rows from table where ((substring_index(columnX,':',4) = '1:0:0:0') OR ((substring_index(columnX,':',2) = '1:') AND (LENGTH (columnX) - LENGTH(REPLACE(columnX, ':', '')) <= 5)))
Gracias, pero es esto depende de saber la clase de subred? – matiasf
@matiasf: Lo es. Eche un vistazo a la actualización. – Jon
Excelente respuesta, pero ¿qué pasa con IPv6? ¿Es eso posible? – TSG