]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Add hashing method
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 18 Jan 2021 20:19:40 +0000 (20:19 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 22 Jan 2021 15:58:05 +0000 (15:58 +0000)
src/libserver/css/css_property.hxx
src/libserver/css/css_rule.hxx

index b3f7262a236712d7a2e489b64a5bdfdfc7d33405..788f4554b6a978472cfe7c456ea512d62859d238 100644 (file)
@@ -46,4 +46,24 @@ struct css_property {
 
 }
 
-#endif //RSPAMD_CSS_PROPERTY_HXX
+/* Make properties hashable */
+namespace std {
+template<>
+class hash<rspamd::css::css_property> {
+public:
+       /* Mix bits to provide slightly better distribution but being constexpr */
+       constexpr size_t operator() (const rspamd::css::css_property &prop) const {
+               std::size_t key = 0xdeadbeef ^static_cast<std::size_t>(prop.type);
+               key = (~key) + (key << 21);
+               key = key ^ (key >> 24);
+               key = (key + (key << 3)) + (key << 8);
+               key = key ^ (key >> 14);
+               key = (key + (key << 2)) + (key << 4);
+               key = key ^ (key >> 28);
+               key = key + (key << 31);
+               return key;
+       }
+};
+}
+
+#endif //RSPAMD_CSS_PROPERTY_HXX
\ No newline at end of file
index bcd542b0c781ba416fd0a01d846c7aa5a8f56243..596e246b3c6cdb2e316d03e6918c547dc67b9a85 100644 (file)
@@ -44,10 +44,21 @@ public:
        void add_value(const css_value &value) {
                values.emplace_back(std::make_unique<css_value>(css_value{value}));
        }
-       const css_values_vec& get_values(void) { return values; }
-       const css_property& get_prop(void) { return prop; }
+       constexpr const css_values_vec& get_values(void) const { return values; }
+       constexpr const css_property& get_prop(void) const { return prop; }
 };
 
 }
 
-#endif //RSPAMD_CSS_RULE_HXX
+/* Make rules hashable by property */
+namespace std {
+template<>
+class hash<rspamd::css::css_rule> {
+public:
+       constexpr size_t operator() (const rspamd::css::css_rule &rule) const {
+               return hash<rspamd::css::css_property>()(rule.get_prop());
+       }
+};
+}
+
+#endif //RSPAMD_CSS_RULE_HXX
\ No newline at end of file