diff --git a/lib/mercenary/command.rb b/lib/mercenary/command.rb
index <HASH>..<HASH> 100644
--- a/lib/mercenary/command.rb
+++ b/lib/mercenary/command.rb
@@ -92,7 +92,7 @@ module Mercenary
     def option(sym, *options)
       new_option = Option.new(sym, options)
       @options << new_option
-      @map[new_option.hash] = sym
+      @map[new_option] = sym
     end
 
     # Public: Adds a subcommand
@@ -178,7 +178,7 @@ module Mercenary
     def process_options(opts, config)
       options.each do |option|
         opts.on(*option.for_option_parser) do |x|
-          config[map[option.hash]] = x
+          config[map[option]] = x
         end
       end
     end
diff --git a/lib/mercenary/option.rb b/lib/mercenary/option.rb
index <HASH>..<HASH> 100644
--- a/lib/mercenary/option.rb
+++ b/lib/mercenary/option.rb
@@ -61,7 +61,7 @@ module Mercenary
     def hash
       instance_variables.map do |var|
         instance_variable_get(var).hash
-      end.reduce(:&)
+      end.reduce(:^)
     end
 
     # Public: Check equivalence of two Options based on equivalence of their
Use option object as key in the command's @map hash, to avoid hash collisions clobbering different options. At the same time, fix Option#hash to use XOR operator rather than AND, to avoid hash collisions.