From 58ee11c58a561f6268d59e26f5e7004cf83fe365 Mon Sep 17 00:00:00 2001
From: nanahi <130121847+na-na-hi@users.noreply.github.com>
Date: Sun, 22 Mar 2026 02:06:21 -0400
Subject: [PATCH] misc/hash: add mp_hash_to_bstr function
This util function uses the generic libavutil hash API to hash any data
with the specified algorithm to a bstr. It deduplicates multiple hash
routines used in mpv.
---
meson.build | 1 +
misc/hash.c | 41 +++++++++++++++++++++++++++++++++++++++++
misc/hash.h | 26 ++++++++++++++++++++++++++
3 files changed, 68 insertions(+)
create mode 100644 misc/hash.c
create mode 100644 misc/hash.h
diff --git a/meson.build b/meson.build
index 84b41dface..f71182c6d0 100644
--- a/meson.build
+++ b/meson.build
@@ -138,6 +138,7 @@ sources = files(
'misc/charset_conv.c',
'misc/codepoint_width.c',
'misc/dispatch.c',
+ 'misc/hash.c',
'misc/io_utils.c',
'misc/json.c',
'misc/language.c',
diff --git a/misc/hash.c b/misc/hash.c
new file mode 100644
index 0000000000..338219e9d5
--- /dev/null
+++ b/misc/hash.c
@@ -0,0 +1,41 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see .
+ */
+
+#include
+
+#include
+
+#include "common/common.h"
+#include "misc/hash.h"
+
+bstr mp_hash_to_bstr(void *talloc_ctx, const uint8_t *data, size_t len, const char *algorithm)
+{
+ struct AVHashContext *ctx = NULL;
+ mp_require(av_hash_alloc(&ctx, algorithm) == 0);
+ int size = av_hash_get_size(ctx);
+ uint8_t hash[AV_HASH_MAX_SIZE] = {0};
+
+ av_hash_init(ctx);
+ av_hash_update(ctx, data, len);
+ av_hash_final(ctx, hash);
+ av_hash_freep(&ctx);
+
+ bstr ret = {0};
+ for (int n = 0; n < size; n++)
+ bstr_xappend_asprintf(talloc_ctx, &ret, "%02X", hash[n]);
+ return ret;
+}
diff --git a/misc/hash.h b/misc/hash.h
new file mode 100644
index 0000000000..e0b6756637
--- /dev/null
+++ b/misc/hash.h
@@ -0,0 +1,26 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see .
+ */
+
+#pragma once
+
+#include "misc/bstr.h"
+
+/*
+ * Return the hashed data as a hex string with upper case letters.
+ * The list of available algorithms is available at libavutil/hash.c.
+ */
+bstr mp_hash_to_bstr(void *talloc_ctx, const uint8_t *data, size_t len, const char *algorithm);