diff --git a/docs/changelog/132959.yaml b/docs/changelog/132959.yaml
new file mode 100644
index 0000000000000..1e1923c3beaf9
--- /dev/null
+++ b/docs/changelog/132959.yaml
@@ -0,0 +1,5 @@
+pr: 132959
+summary: Adds the `v_hamming` function for calculating the Hamming distance between two dense vectors
+area: ES|QL
+type: feature
+issues: [132056]
diff --git a/docs/reference/query-languages/esql/_snippets/functions/description/v_hamming.md b/docs/reference/query-languages/esql/_snippets/functions/description/v_hamming.md
new file mode 100644
index 0000000000000..1f200140065f7
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/description/v_hamming.md
@@ -0,0 +1,6 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Description**
+
+Calculates the Hamming distance between two dense vectors.
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/examples/v_hamming.md b/docs/reference/query-languages/esql/_snippets/functions/examples/v_hamming.md
new file mode 100644
index 0000000000000..6a8a5b38350e6
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/examples/v_hamming.md
@@ -0,0 +1,24 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Example**
+
+```esql
+ from colors
+ | eval similarity = v_hamming(rgb_vector, [0, 255, 255])
+ | sort similarity desc, color asc
+```
+
+| color:text | similarity:double |
+| --- | --- |
+| red | 24.0 |
+| orange | 20.0 |
+| gold | 18.0 |
+| indigo | 18.0 |
+| bisque | 17.0 |
+| maroon | 17.0 |
+| pink | 17.0 |
+| salmon | 17.0 |
+| black | 16.0 |
+| firebrick | 16.0 |
+
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/layout/v_hamming.md b/docs/reference/query-languages/esql/_snippets/functions/layout/v_hamming.md
new file mode 100644
index 0000000000000..65354c6380f64
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/layout/v_hamming.md
@@ -0,0 +1,27 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+## `V_HAMMING` [esql-v_hamming]
+```{applies_to}
+stack: preview 9.2.0
+serverless: preview
+```
+
+**Syntax**
+
+:::{image} ../../../images/functions/v_hamming.svg
+:alt: Embedded
+:class: text-center
+:::
+
+
+:::{include} ../parameters/v_hamming.md
+:::
+
+:::{include} ../description/v_hamming.md
+:::
+
+:::{include} ../types/v_hamming.md
+:::
+
+:::{include} ../examples/v_hamming.md
+:::
diff --git a/docs/reference/query-languages/esql/_snippets/functions/parameters/v_hamming.md b/docs/reference/query-languages/esql/_snippets/functions/parameters/v_hamming.md
new file mode 100644
index 0000000000000..6fe93636f0764
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/parameters/v_hamming.md
@@ -0,0 +1,10 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Parameters**
+
+`left`
+: First dense_vector to use to calculate the Hamming distance
+
+`right`
+: Second dense_vector to use to calculate the Hamming distance
+
diff --git a/docs/reference/query-languages/esql/images/functions/v_hamming.svg b/docs/reference/query-languages/esql/images/functions/v_hamming.svg
new file mode 100644
index 0000000000000..1fb76c406cb08
--- /dev/null
+++ b/docs/reference/query-languages/esql/images/functions/v_hamming.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json
new file mode 100644
index 0000000000000..51e3660ae8650
--- /dev/null
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json
@@ -0,0 +1,12 @@
+{
+ "comment" : "This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.",
+ "type" : "scalar",
+ "name" : "v_hamming",
+ "description" : "Calculates the Hamming distance between two dense vectors.",
+ "signatures" : [ ],
+ "examples" : [
+ " from colors\n | eval similarity = v_hamming(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
+ ],
+ "preview" : true,
+ "snapshot_only" : true
+}
diff --git a/docs/reference/query-languages/esql/kibana/docs/functions/v_hamming.md b/docs/reference/query-languages/esql/kibana/docs/functions/v_hamming.md
new file mode 100644
index 0000000000000..8de48ee0292ca
--- /dev/null
+++ b/docs/reference/query-languages/esql/kibana/docs/functions/v_hamming.md
@@ -0,0 +1,10 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+### V HAMMING
+Calculates the Hamming distance between two dense vectors.
+
+```esql
+ from colors
+ | eval similarity = v_hamming(rgb_vector, [0, 255, 255])
+ | sort similarity desc, color asc
+```
diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-hamming.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-hamming.csv-spec
new file mode 100644
index 0000000000000..a7e8815139567
--- /dev/null
+++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-hamming.csv-spec
@@ -0,0 +1,103 @@
+ # Tests for hamming similarity function
+
+ similarityWithVectorField
+ required_capability: hamming_vector_similarity_function
+
+// tag::vector-hamming[]
+ from colors
+ | eval similarity = v_hamming(rgb_vector, [0, 255, 255])
+ | sort similarity desc, color asc
+// end::vector-hamming[]
+ | limit 10
+ | keep color, similarity
+ ;
+
+// tag::vector-hamming-result[]
+color:text | similarity:double
+red | 24.0
+orange | 20.0
+gold | 18.0
+indigo | 18.0
+bisque | 17.0
+maroon | 17.0
+pink | 17.0
+salmon | 17.0
+black | 16.0
+firebrick | 16.0
+// end::vector-hamming-result[]
+;
+
+similarityAsPartOfExpression
+required_capability: hamming_vector_similarity_function
+
+from colors
+| eval score = round((1 + v_hamming(rgb_vector, [0, 255, 255]) / 2), 3)
+| sort score desc, color asc
+| limit 10
+| keep color, score
+;
+
+color:text | score:double
+red | 13.0
+orange | 11.0
+gold | 10.0
+indigo | 10.0
+bisque | 9.5
+maroon | 9.5
+pink | 9.5
+salmon | 9.5
+black | 9.0
+firebrick | 9.0
+;
+
+similarityWithLiteralVectors
+required_capability: hamming_vector_similarity_function
+
+row a = 1
+| eval similarity = round(v_hamming([1, 2, 3], [0, 1, 2]), 3)
+| keep similarity
+;
+
+similarity:double
+4.0
+;
+
+similarityWithStats
+required_capability: hamming_vector_similarity_function
+
+from colors
+| eval similarity = round(v_hamming(rgb_vector, [0, 255, 255]), 3)
+| stats avg = round(avg(similarity), 3), min = min(similarity), max = max(similarity)
+;
+
+avg:double | min:double | max:double
+13.322 | 0.0 | 24.0
+;
+
+similarityWithNull
+required_capability: hamming_vector_similarity_function
+required_capability: vector_similarity_functions_support_null
+
+from colors
+| eval similarity = v_hamming(rgb_vector, null)
+| stats total_null = count(*) where similarity is null
+;
+
+total_null:long
+59
+;
+
+# TODO Need to implement a conversion function to convert a non-foldable row to a dense_vector
+similarityWithRow-Ignore
+required_capability: hamming_vector_similarity_function
+
+row vector = [1, 2, 3]
+| eval similarity = round(v_hamming(vector, [0, 1, 2]), 3)
+| sort similarity desc, color asc
+| limit 10
+| keep color, similarity
+;
+
+similarity:double
+0.978
+;
diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java
index 2d85e3bd7f93c..4ab018d3eac11 100644
--- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java
+++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java
@@ -24,6 +24,7 @@
import org.elasticsearch.xpack.esql.EsqlTestUtils;
import org.elasticsearch.xpack.esql.action.AbstractEsqlIntegTestCase;
import org.elasticsearch.xpack.esql.action.EsqlCapabilities;
+import org.elasticsearch.xpack.esql.expression.function.vector.Hamming;
import org.elasticsearch.xpack.esql.expression.function.vector.L1Norm;
import org.elasticsearch.xpack.esql.expression.function.vector.L2Norm;
import org.elasticsearch.xpack.esql.expression.function.vector.VectorSimilarityFunction.SimilarityEvaluatorFunction;
@@ -56,6 +57,9 @@ public static Iterable