]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Faster chan_circid_entry_hash implementation
authorNick Mathewson <nickm@torproject.org>
Tue, 6 May 2014 16:27:18 +0000 (12:27 -0400)
committerNick Mathewson <nickm@torproject.org>
Tue, 6 May 2014 16:27:18 +0000 (12:27 -0400)
Since this is critical-path, let's tune the value we pass to
csiphash a little so it fits into one whole round.

src/or/circuitlist.c

index 58fb22d8ce4491abf610c97ba3726c0abcd077bd..e5ed9c04fd2dc319e553b67f96af1175a975803c 100644 (file)
@@ -76,14 +76,15 @@ chan_circid_entries_eq_(chan_circid_circuit_map_t *a,
 static INLINE unsigned int
 chan_circid_entry_hash_(chan_circid_circuit_map_t *a)
 {
-  struct {
-    void *chan;
-    circid_t circid;
-  } s;
-  memset(&s, 0, sizeof(s));
-  s.chan = a->chan;
-  s.circid = a->circ_id;
-  return (unsigned) siphash24g(&s, sizeof(s));
+  /* Try to squeze the siphash input into 8 bytes to save any extra siphash
+   * rounds.  This hash function is in the critical path. */
+  uintptr_t chan = (uintptr_t) (void*) a->chan;
+  uint32_t array[2];
+  array[0] = a->circ_id;
+  /* The low bits of the channel pointer are uninteresting, since the channel
+   * is a pretty big structure. */
+  array[1] = (uint32_t) (chan >> 6);
+  return (unsigned) siphash24g(array, sizeof(array));
 }
 
 /** Map from [chan,circid] to circuit. */