Refs #2578 -- implement __hash__ on AccessDescription
diff --git a/src/cryptography/x509/extensions.py b/src/cryptography/x509/extensions.py
index 3e6fc3b..fe9bcf9 100644
--- a/src/cryptography/x509/extensions.py
+++ b/src/cryptography/x509/extensions.py
@@ -313,6 +313,9 @@
     def __ne__(self, other):
         return not self == other
 
+    def __hash__(self):
+        return hash((self.access_method, self.access_location))
+
     access_method = utils.read_only_property("_access_method")
     access_location = utils.read_only_property("_access_location")
 
diff --git a/tests/test_x509_ext.py b/tests/test_x509_ext.py
index ff82645..b13405d 100644
--- a/tests/test_x509_ext.py
+++ b/tests/test_x509_ext.py
@@ -2228,6 +2228,22 @@
         assert ad != ad3
         assert ad != object()
 
+    def test_hash(self):
+        ad = x509.AccessDescription(
+            AuthorityInformationAccessOID.OCSP,
+            x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
+        )
+        ad2 = x509.AccessDescription(
+            AuthorityInformationAccessOID.OCSP,
+            x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
+        )
+        ad3 = x509.AccessDescription(
+            AuthorityInformationAccessOID.CA_ISSUERS,
+            x509.UniformResourceIdentifier(u"http://ocsp.domain.com")
+        )
+        assert hash(ad) == hash(ad2)
+        assert hash(ad) != hash(ad3)
+
 
 class TestAuthorityInformationAccess(object):
     def test_invalid_descriptions(self):