diff --git a/src/com/facebook/buck/rules/RuleKey.java b/src/com/facebook/buck/rules/RuleKey.java
index eec7e8e..580d1a2 100644
--- a/src/com/facebook/buck/rules/RuleKey.java
+++ b/src/com/facebook/buck/rules/RuleKey.java
@@ -72,19 +72,7 @@
    *     {@link com.google.common.hash.HashCode#toString()}.
    */
   public RuleKey(String hashString) {
-    this(HashCode.fromBytes(hashStringToBytes(hashString)));
-  }
-
-  private static byte[] hashStringToBytes(String hashString) {
-    byte[] bytes = new byte[hashString.length() / 2];
-    for (int i = 0; i < hashString.length(); i += 2) {
-      char highOrderBits = hashString.charAt(i);
-      char lowOrderBits = hashString.charAt(i + 1);
-      bytes[i / 2] = (byte)
-          ((Byte.parseByte(String.valueOf(highOrderBits), 16) << 4) +
-          Byte.parseByte(String.valueOf(lowOrderBits), 16));
-    }
-    return bytes;
+    this(HashCode.fromString(hashString));
   }
 
   public HashCode getHashCode() {
@@ -124,10 +112,6 @@
     return this.getHashCode().hashCode();
   }
 
-  public static Builder builder() {
-    return new Builder();
-  }
-
   /**
    * Builder for a {@link RuleKey} that is a function of all of a {@link BuildRule}'s input
    * arguments.
@@ -175,23 +159,16 @@
     private static final Logger logger = Logger.getLogger(Builder.class.getName());
 
     private final Hasher hasher;
-    private boolean idempotent;
     @Nullable private List<String> logElms;
 
     private Builder() {
       hasher = Hashing.sha1().newHasher();
-      idempotent = true;
       if (logger.isLoggable(Level.INFO)) {
         logElms = Lists.newArrayList();
       }
       setBuckVersionUID();
     }
 
-    private Builder(String header) {
-      this();
-      setHeader(header);
-    }
-
     private Builder feed(byte[] bytes) {
       hasher.putBytes(bytes);
       return this;
@@ -209,13 +186,6 @@
       feed(buckVersionUID.getBytes()).separate();
     }
 
-    private void setHeader(String header) {
-      if (logElms != null) {
-        logElms.add(String.format("header(%s):", header));
-      }
-      feed(header.getBytes()).separate();
-    }
-
     private Builder setKey(String sectionLabel) {
       if (logElms != null) {
         logElms.add(String.format(":key(%s):", sectionLabel));
@@ -387,7 +357,7 @@
     }
 
     public RuleKey build() {
-      RuleKey ruleKey = idempotent ? new RuleKey(hasher.hash()) : new RuleKey((HashCode)null);
+      RuleKey ruleKey = new RuleKey(hasher.hash());
       if (logElms != null) {
         logger.info(String.format("RuleKey %s=%s", ruleKey, Joiner.on("").join(logElms)));
       }
