diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts
index 806bba5d4340de6c2e31c773700ccb1befb45d61..cf4f66928aba1c2b578f7a978875d5461c620e1d 100644
--- a/packages/core/src/Node.ts
+++ b/packages/core/src/Node.ts
@@ -183,7 +183,7 @@ export class TextNode<T extends Metadata = Metadata> extends BaseNode<T> {
     if (new.target === TextNode) {
       // Don't generate the hash repeatedly so only do it if this is
       // constructing the derived class
-      this.hash = this.generateHash();
+      this.hash = init?.hash ?? this.generateHash();
     }
   }
 
@@ -234,7 +234,6 @@ export class TextNode<T extends Metadata = Metadata> extends BaseNode<T> {
 
   setContent(value: string) {
     this.text = value;
-
     this.hash = this.generateHash();
   }
 
@@ -255,7 +254,7 @@ export class IndexNode<T extends Metadata = Metadata> extends TextNode<T> {
     Object.assign(this, init);
 
     if (new.target === IndexNode) {
-      this.hash = this.generateHash();
+      this.hash = init?.hash ?? this.generateHash();
     }
   }
 
@@ -273,7 +272,7 @@ export class Document<T extends Metadata = Metadata> extends TextNode<T> {
     Object.assign(this, init);
 
     if (new.target === Document) {
-      this.hash = this.generateHash();
+      this.hash = init?.hash ?? this.generateHash();
     }
   }
 
@@ -334,7 +333,7 @@ export class ImageDocument<T extends Metadata = Metadata> extends ImageNode<T> {
     super(init);
 
     if (new.target === ImageDocument) {
-      this.hash = this.generateHash();
+      this.hash = init?.hash ?? this.generateHash();
     }
   }
 
diff --git a/packages/core/src/tests/Node.test.ts b/packages/core/src/tests/Node.test.ts
index 656ad7d7cdf883839921af66db8956cb04c65543..43768730ea2560b82d7e0d7c9637d5ba0090057d 100644
--- a/packages/core/src/tests/Node.test.ts
+++ b/packages/core/src/tests/Node.test.ts
@@ -7,9 +7,13 @@ describe("TextNode", () => {
     node = new TextNode({ text: "Hello World" });
   });
 
-  describe("generateHash", () => {
-    it("should generate a hash", () => {
-      expect(node.hash).toBe("nTSKdUTYqR52MPv/brvb4RTGeqedTEqG9QN8KSAj2Do=");
-    });
+  test("should generate a hash", () => {
+    expect(node.hash).toBe("nTSKdUTYqR52MPv/brvb4RTGeqedTEqG9QN8KSAj2Do=");
+  });
+
+  test("clone should have the same hash", () => {
+    const hash = node.hash;
+    const clone = node.clone();
+    expect(clone.hash).toBe(hash);
   });
 });