Hi, beim Start meiner App öffne ich einen Socket, damit beim Start einer zweiten Instanz dies scheitert (Socket ist schon offen), und ich das Programm beenden kann, da nicht 2 Instanzen laufen sollen. Jetzt sollen aber nur 2 Instanzen dann nicht laufen können, wenn es die gleiche JAR war, d.h.
liefert bei beiden das selbe. Da ich den Socket davon abhängig machen muss, dachte ich mir ich leite den Port von dem hashCode des Pfades ab. Da der Port ja nicht beliebig sein darf, muss ich sicherstellen dass der Wert 1) positiv ist und 2) im gültigen Wertebereich für Ports liegt. Für zweiteres nutze ich modulo, also das ganze sieht so aus:
hashCode() kann ja auch nicht zu 100% garantieren, dass nicht 2x das selbe rauskommt bei 2 verschiedenen Strings. Aber es ist ja doch so implementiert dass es "quasi-unmöglich" ist. So, nun meine Frage: Inwiefern verfälsche ich die Sicherheit von hashCode() durch das modulo? Ist das okay, oder seht ihr da evtl Probleme in der Praxis?
Dreist gesagt könnte ich es jetzt auch so formulieren: Wie würdet ihr dat machen, gebt ma' Code her aber zack zack
(Falls ihr dieses Vorgehen für zu unsicher anseht)
Java:
String path = new File("").getAbsolutePath();
liefert bei beiden das selbe. Da ich den Socket davon abhängig machen muss, dachte ich mir ich leite den Port von dem hashCode des Pfades ab. Da der Port ja nicht beliebig sein darf, muss ich sicherstellen dass der Wert 1) positiv ist und 2) im gültigen Wertebereich für Ports liegt. Für zweiteres nutze ich modulo, also das ganze sieht so aus:
Java:
/* get runtime environment path */
String path = new File("").getAbsolutePath();
/*
* Open a socket using a port derived from the database path. Exit if an
* instance with the same database is already running
*/
try {
int greatestPort = 65535;
new ServerSocket(Math.abs(path.hashCode()) % greatestPort, 0,
InetAddress.getByName("localhost"));
} catch (BindException e) {
e.printStackTrace();
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
hashCode() kann ja auch nicht zu 100% garantieren, dass nicht 2x das selbe rauskommt bei 2 verschiedenen Strings. Aber es ist ja doch so implementiert dass es "quasi-unmöglich" ist. So, nun meine Frage: Inwiefern verfälsche ich die Sicherheit von hashCode() durch das modulo? Ist das okay, oder seht ihr da evtl Probleme in der Praxis?
Dreist gesagt könnte ich es jetzt auch so formulieren: Wie würdet ihr dat machen, gebt ma' Code her aber zack zack