aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cryptography/x509/name.py8
-rw-r--r--tests/test_x509.py17
2 files changed, 25 insertions, 0 deletions
diff --git a/src/cryptography/x509/name.py b/src/cryptography/x509/name.py
index 992786ef..9d93ece1 100644
--- a/src/cryptography/x509/name.py
+++ b/src/cryptography/x509/name.py
@@ -40,6 +40,9 @@ class NameAttribute(object):
def __ne__(self, other):
return not self == other
+ def __hash__(self):
+ return hash((self.oid, self.value))
+
def __repr__(self):
return "<NameAttribute(oid={0.oid}, value={0.value!r})>".format(self)
@@ -60,6 +63,11 @@ class Name(object):
def __ne__(self, other):
return not self == other
+ def __hash__(self):
+ # TODO: this is relatively expensive, if this looks like a bottleneck
+ # for you, consider optimizing!
+ return hash(tuple(self._attributes))
+
def __iter__(self):
return iter(self._attributes)
diff --git a/tests/test_x509.py b/tests/test_x509.py
index cb05daf0..e7de2efd 100644
--- a/tests/test_x509.py
+++ b/tests/test_x509.py
@@ -2755,6 +2755,23 @@ class TestName(object):
assert name1 != name2
assert name1 != object()
+ def test_hah(self):
+ name1 = x509.Name([
+ x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
+ x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
+ ])
+ name2 = x509.Name([
+ x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
+ x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
+ ])
+ name3 = x509.Name([
+ x509.NameAttribute(x509.ObjectIdentifier('oid2'), u'value2'),
+ x509.NameAttribute(x509.ObjectIdentifier('oid'), u'value1'),
+ ])
+
+ assert hash(name1) == hash(name2)
+ assert hash(name1) != hash(name3)
+
def test_repr(self):
name = x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, u'cryptography.io'),