Skip to content

Commit e0822d8

Browse files
[3.13] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) (#134477)
gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) (cherry picked from commit f3fc0c1) gh-134062: Fix hash collisions in IPv4Network and IPv6Network gh-134062: Add hash collision regression test Co-authored-by: Mike Salvatore <[email protected]>
1 parent 5ecc39e commit e0822d8

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

Lib/ipaddress.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def __eq__(self, other):
734734
return NotImplemented
735735

736736
def __hash__(self):
737-
return hash(int(self.network_address) ^ int(self.netmask))
737+
return hash((int(self.network_address), int(self.netmask)))
738738

739739
def __contains__(self, other):
740740
# always false if one is v4 and the other is v6.

Lib/test/test_ipaddress.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2756,6 +2756,34 @@ def testV6HashIsNotConstant(self):
27562756
ipv6_address2 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:2")
27572757
self.assertNotEqual(ipv6_address1.__hash__(), ipv6_address2.__hash__())
27582758

2759+
# issue 134062 Hash collisions in IPv4Network and IPv6Network
2760+
def testNetworkV4HashCollisions(self):
2761+
self.assertNotEqual(
2762+
ipaddress.IPv4Network("192.168.1.255/32").__hash__(),
2763+
ipaddress.IPv4Network("192.168.1.0/24").__hash__()
2764+
)
2765+
self.assertNotEqual(
2766+
ipaddress.IPv4Network("172.24.255.0/24").__hash__(),
2767+
ipaddress.IPv4Network("172.24.0.0/16").__hash__()
2768+
)
2769+
self.assertNotEqual(
2770+
ipaddress.IPv4Network("192.168.1.87/32").__hash__(),
2771+
ipaddress.IPv4Network("192.168.1.86/31").__hash__()
2772+
)
2773+
2774+
# issue 134062 Hash collisions in IPv4Network and IPv6Network
2775+
def testNetworkV6HashCollisions(self):
2776+
self.assertNotEqual(
2777+
ipaddress.IPv6Network("fe80::/64").__hash__(),
2778+
ipaddress.IPv6Network("fe80::ffff:ffff:ffff:0/112").__hash__()
2779+
)
2780+
self.assertNotEqual(
2781+
ipaddress.IPv4Network("10.0.0.0/8").__hash__(),
2782+
ipaddress.IPv6Network(
2783+
"ffff:ffff:ffff:ffff:ffff:ffff:aff:0/112"
2784+
).__hash__()
2785+
)
2786+
27592787

27602788
if __name__ == '__main__':
27612789
unittest.main()
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:mod:`ipaddress`: fix collisions in :meth:`~object.__hash__` for
2+
:class:`~ipaddress.IPv4Network` and :class:`~ipaddress.IPv6Network`
3+
objects.

0 commit comments

Comments
 (0)