ho una soluzione per quando gli indirizzi sono memorizzati come stringhe. Quindi se vuoi fare quella parte del tuo algoritmo, puoi usare la mia soluzione qui.
È un po 'complicato, specialmente per IPv6. In IPv6 possono essere opzionalmente dei segmenti compressi, come 1 :: 1 che è equivalente a 1: 0: 0: 0: 0: 0: 0: 1, che è la ragione principale per cui è complicato.
The IPAddress Java library produrrà mysql SQL per cercare indirizzi in una determinata subnet. Il collegamento descrive questo problema in modo più dettagliato. Disclaimer: io sono il project manager.
L'algoritmo di base consiste nel prendere la sezione di rete dell'indirizzo di sottorete, quindi prendere ogni variante di quella sezione (ad esempio le due stringhe sopra riportate sono varianti dell'indirizzo completo 1 :: 1), quindi contare il numero di segmenti separatori, quindi eseguire una sottostringa mysql sull'indirizzo corrispondente, ma anche contare i separatori totali nell'indirizzo che corrisponde.
Ecco il codice di esempio:
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)))
Grazie, ma è questo dipende conoscendo la classe sottorete? – matiasf
@matiasf: lo è. Dai un'occhiata all'aggiornamento. – Jon
Ottima risposta - ma che dire di IPv6? È possibile? – TSG