diff --git a/src/gn/ninja_build_writer.cc b/src/gn/ninja_build_writer.cc
index 28e2fa6..9fb6a7d 100644
--- a/src/gn/ninja_build_writer.cc
+++ b/src/gn/ninja_build_writer.cc
@@ -8,8 +8,8 @@
 
 #include <fstream>
 #include <map>
+#include <set>
 #include <sstream>
-#include <unordered_set>
 
 #include "base/command_line.h"
 #include "base/files/file_util.h"
@@ -25,6 +25,7 @@
 #include "gn/ninja_utils.h"
 #include "gn/pool.h"
 #include "gn/scheduler.h"
+#include "gn/string_atom.h"
 #include "gn/switches.h"
 #include "gn/target.h"
 #include "gn/trace.h"
@@ -339,7 +340,7 @@
 
 void NinjaBuildWriter::WriteAllPools() {
   // Compute the pools referenced by all tools of all used toolchains.
-  std::unordered_set<const Pool*> used_pools;
+  std::set<const Pool*> used_pools;
   for (const auto& pair : used_toolchains_) {
     for (const auto& tool : pair.second->tools()) {
       if (tool.second->pool().ptr)
@@ -466,8 +467,8 @@
   // Track rules as we generate them so we don't accidentally write a phony
   // rule that collides with something else.
   // GN internally generates an "all" target, so don't duplicate it.
-  std::unordered_set<std::string> written_rules;
-  written_rules.insert("all");
+  std::set<StringAtom, StringAtom::PtrCompare> written_rules;
+  written_rules.insert(StringAtom("all"));
 
   // Set if we encounter a target named "//:default".
   const Target* default_target = nullptr;
@@ -532,7 +533,9 @@
       // with "./".
       std::string output_string(output.value());
       NormalizePath(&output_string);
-      if (!written_rules.insert(output_string).second) {
+      const StringAtom output_string_atom(output_string);
+
+      if (!written_rules.insert(output_string_atom).second) {
         *err = GetDuplicateOutputError(default_toolchain_targets_, output);
         return false;
       }
@@ -541,14 +544,14 @@
 
   // First prefer the short names of toplevel targets.
   for (const Target* target : toplevel_targets) {
-    if (written_rules.insert(target->label().name()).second)
-      WritePhonyRule(target, target->label().name());
+    if (written_rules.insert(target->label().name_atom()).second)
+      WritePhonyRule(target, target->label().name_atom());
   }
 
   // Next prefer short names of toplevel dir targets.
   for (const Target* target : toplevel_dir_targets) {
-    if (written_rules.insert(target->label().name()).second)
-      WritePhonyRule(target, target->label().name());
+    if (written_rules.insert(target->label().name_atom()).second)
+      WritePhonyRule(target, target->label().name_atom());
   }
 
   // Write out the names labels of executables. Many toolchains will produce
@@ -563,7 +566,7 @@
   // toplevel build rule.
   for (const auto& pair : exes) {
     const Counts& counts = pair.second;
-    const std::string& short_name = counts.last_seen->label().name();
+    const StringAtom& short_name = counts.last_seen->label().name_atom();
     if (counts.count == 1 && written_rules.insert(short_name).second)
       WritePhonyRule(counts.last_seen, short_name);
   }
@@ -571,7 +574,7 @@
   // Write short names when those names are unique and not already taken.
   for (const auto& pair : short_names) {
     const Counts& counts = pair.second;
-    const std::string& short_name = counts.last_seen->label().name();
+    const StringAtom& short_name = counts.last_seen->label().name_atom();
     if (counts.count == 1 && written_rules.insert(short_name).second)
       WritePhonyRule(counts.last_seen, short_name);
   }
@@ -583,19 +586,22 @@
     // Write the long name "foo/bar:baz" for the target "//foo/bar:baz".
     std::string long_name = label.GetUserVisibleName(false);
     base::TrimString(long_name, "/", &long_name);
-    if (written_rules.insert(long_name).second)
-      WritePhonyRule(target, long_name);
+    const StringAtom long_name_atom(long_name);
+    if (written_rules.insert(long_name_atom).second)
+      WritePhonyRule(target, long_name_atom);
 
     // Write the directory name with no target name if they match
     // (e.g. "//foo/bar:bar" -> "foo/bar").
     if (FindLastDirComponent(label.dir()) == label.name()) {
       std::string medium_name = DirectoryWithNoLastSlash(label.dir());
       base::TrimString(medium_name, "/", &medium_name);
+      const StringAtom medium_name_atom(medium_name);
+
       // That may have generated a name the same as the short name of the
       // target which we already wrote.
       if (medium_name != label.name() &&
-          written_rules.insert(medium_name).second)
-        WritePhonyRule(target, medium_name);
+          written_rules.insert(medium_name_atom).second)
+        WritePhonyRule(target, medium_name_atom);
     }
   }
 
@@ -614,7 +620,7 @@
 
   if (default_target) {
     // Use the short name when available
-    if (written_rules.find("default") != written_rules.end()) {
+    if (written_rules.find(StringAtom("default")) != written_rules.end()) {
       out_ << "\ndefault default" << std::endl;
     } else {
       out_ << "\ndefault ";
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc
index 17f9c08..ddff182 100644
--- a/src/gn/ninja_c_binary_target_writer.cc
+++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -10,7 +10,6 @@
 #include <cstring>
 #include <set>
 #include <sstream>
-#include <unordered_set>
 
 #include "base/strings/string_util.h"
 #include "gn/c_substitution_type.h"
@@ -881,7 +880,7 @@
 
 bool NinjaCBinaryTargetWriter::CheckForDuplicateObjectFiles(
     const std::vector<OutputFile>& files) const {
-  std::unordered_set<std::string> set;
+  std::set<std::string> set;
   for (const auto& file : files) {
     if (!set.insert(file.value()).second) {
       Err err(
diff --git a/src/gn/string_atom.cc b/src/gn/string_atom.cc
index b4cd9f7..7842fdd 100644
--- a/src/gn/string_atom.cc
+++ b/src/gn/string_atom.cc
@@ -9,7 +9,6 @@
 #include <mutex>
 #include <set>
 #include <string>
-#include <unordered_set>
 #include <vector>
 
 #include "gn/hash_table_base.h"
diff --git a/src/gn/unique_vector.h b/src/gn/unique_vector.h
index ce5380b..91bf726 100644
--- a/src/gn/unique_vector.h
+++ b/src/gn/unique_vector.h
@@ -8,7 +8,6 @@
 #include <stddef.h>
 
 #include <algorithm>
-#include <unordered_set>
 #include <vector>
 
 #include "hash_table_base.h"
