FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Klarade millennium-buggen
|
Undrar om det finns något sätt som folk använder för att söka igenom ip-ranges i en databas. Jag har alltså start- och stop-IP lagrat men det är ju inte så kul att försöka pussla ihop en select-sats för detta.
Jag såg någonstans att det användes någon form av summa för att representera IP'et så att man lättare kan söka i databasen. Någon som vet hur denna omräkning sker från IP till "vanligt" tal? |
|||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Klarade millennium-buggen
|
Hmm, kan man göra såhär:
exempelvis IP = 2.6.190.56 så blir det unika talet 2 * 256 * 256 * 256 = 33554432 6 * 256 * 256 = 393216 190 * 256 = 48640 56 * 1 = 56 Summa: 33554432 + 393216 + 48640 + 56 = 33996344 ????? |
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
I MySQL går sådant i alla fall att fixa enkelt.
SELECT * FROM t1 WHERE '10.0.0.25' BETWEEN ip_begin AND ip_end; Om det verkligen fungerar för alla intervall är jag däremot osäker på. Om det inte gör det så kan du istället göra precis som spåret du är inne på och använda heltalsrepresentation av en ip-adress. I MySQL finns funktionen INET_ATON() för att omvandla en IP-adress på n1.n2.n3.n4-format till ett heltal. Alla scriptspråk lär förresten ha någon motsvarande funktion, på rak arm vet jag att PHP har ip2long() för det ändamålet. Kod:
department ip_begin ip_end ip_long_begin ip_long_end dep1 10.0.0.1 10.0.0.20 167772161 167772180 dep2 10.0.0.21 10.0.0.40 167772181 167772200 dep3 10.0.0.41 10.0.0.60 167772201 167772220 SELECT dep FROM t1 WHERE INET_ATON('10.0.0.25') BETWEEN ip_long_begin AND ip_long_end; > dep2 |
||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Klarade millennium-buggen
|
Jo, det är precis det jag menar! =)
Frågan är om jag har räknat tänkt rätt med min matematikbefriade hjärna... Även om ex MSSql server har en sådan funktion så vill jag ändå köra med en numerisk representation då jag antar att det blir snabbare... |
|||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Medlem
|
Jodå, du tänker rätt så vitt jag kan bedömma.
![]() |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Mycket flitig postare
|
Du tänker helt rätt. och mysql INET_ATON() är helt rätt väg att gå.
Just den ger "rätt" byteorder (för det du vill göra) eftersom INET_ATON('1.2.4.8') ger 0x01020408. Använder du ett annat språk bör du kolla detta så at inte 1.2.3.4 blir 0x08040201 som är alternativet. |
||
![]() |
![]() |
Svara |
|
|