JavaScript: Est la propriété intellectuelle Dans l'Un De Ces sous-Réseaux?
J'ai donc ~12600 sous-réseaux:
par exemple. 123.123.208.0/20
et une adresse IP.
Je peux utiliser une Base de données SQLite ou un tableau, ou de quoi que
Il y a une question similaire posée sur il y a un mois, mais je ne suis pas à la recherche pour le contrôle de l'une IP contre un sous-réseau, mais un tas de sous-réseaux (évidemment le moyen le plus efficace, espérons-le, pas O(total sous-réseaux)) 🙂
Comment puis-je vérifier que l'IP est l'une des dans une de ces sous-réseaux, j'ai besoin de vrai ou de faux pas le sous-réseau si cela contribue à l'optimisation.
Il existe des sous-réseaux dans la liste actuelle par exemple.:
(extrait réel)
123.123.48.0/22 <-- not a typo
123.123.48.0/24 <-- not a typo
123.123.90.0/24
123.123.91.0/24
123.123.217.0/24
Dans l'ensemble, elles vont de 4.x.y.z à 222.x.y.z
OriginalL'auteur Steve | 2009-02-02
Vous devez vous connecter pour publier un commentaire.
La meilleure approche est de l'OMI, en faisant usage des opérateurs au niveau du bit. Par exemple,
123.123.48.0/22
représente(123<<24)+(123<<16)+(48<<8)+0
(=2071670784, ce qui peut être un nombre négatif) comme une application 32 bits de l'adresse IP numérique, et-1<<(32-22)
= -1024 comme un masque. Avec cela, et de même, le test de l'adresse IP converti en un nombre, vous pouvez le faire:Par exemple, 123.123.49.123 est dans cette plage, comme
2071671163 & -1024
est 2071670784Alors, voici quelques fonctions de l'outil:
test:
rendements
true
.Dans le cas où votre masque est dans le format "255.255.252.0', alors vous pouvez utiliser l'adresse ip de la fonction pour le masque, trop.
"garantie endian" codage? Je ne vois pas pourquoi il se doit. C'est juste des chiffres. De toute façon, en effet, vous pouvez trouver à la fois inférieure et la limite supérieure de la plage avec IP&masque et avec IP|~masque (~-1024==1023), respectivement, de sorte que vous pouvez utiliser ENTRE à la recherche pour les matches de la plage.
J'ai seulement entrée IP et le masque, je veux vérifier que l'entrée de l'IP se trouve dans le masque de gamme ou pas ( masque en format 255.255.252.0 ) Comment faire pour vérifier ?
Un bug: si votre sous-réseau n'est pas correctement définie à droite de 0, ce sera un échec. De faire de mauvaises définitions de travail, l'utilisation (adresse ip('123.123.49.123') & IPmask('22')) == (adresse ip('123.123.48.1') & IPmask('22'))
OriginalL'auteur bart
Essayez ceci:
Utilisation:
return (long_ip > base_ip || long_ip === base_ip) && ((long_ip < base_ip + freedom - 1) || (long_ip === base_ip + freedom - 1));
OriginalL'auteur djfm
Convertir l'adresse ip inférieur et la partie supérieure de la propriété intellectuelle dans la gamme de nombres entiers et de stocker la gamme dans la db, alors assurez-vous que les deux colonnes sont indexées.
Sur le dessus de ma tête (pseudo-code):
Qui devrait le faire.
Pour savoir si une ip particulière appartient à l'une des plages de convertir un nombre entier et à faire:
L'optimiseur de requête devrait être en mesure de la vitesse de ce bien.
Le début et la fin de l'ips de la gamme sera différent. de sorte que le chevauchement ne devrait pas être un problème.
N'est-ce pas: 123.123.48.0/22: 123.123.48.1 - 123.123.51.254 & 123.123.48.0/24: 123.123.48.1 - 123.123.48.254
Et la fin de la différer, quel est donc le problème?
Ne serait pas une meilleure solution, supprimer les redondances /24? Je suppose que je pourrais toujours prendre le plus bas /x et supprimer toutes les plus élevés de sous-réseaux.
OriginalL'auteur Allain Lalonde
J'ai réussi à résoudre ce problème en utilisant la nœud de masque de réseau module.
Vous pouvez vérifier si l'IP appartient à un sous-réseau en faisant quelque chose comme ceci:
Sera ici d'impression
true
.Vous pouvez l'installer en utilisant:
OriginalL'auteur Balthazar
Fonctions
IPnumber
etIPmask
sont bien, mais je préfère comme le test:Parce que, pour chaque adresse, vous avez seulement besoin de prendre en compte la partie réseau de l'adresse. Donc faire
IPmask('22')
est mise à zéro de l'ordinateur de la partie de l'adresse, et vous devriez en faire de même avec l'adresse réseau.OriginalL'auteur skaiffer