diff --git a/src/core/tests/utils.py b/src/core/tests/utils.py
index 1a7ff7a5353833808dfc718c0e39333343cef4b3..568be24a70ab849ecc8a86440d2bf8478c5bbf60 100644
--- a/src/core/tests/utils.py
+++ b/src/core/tests/utils.py
@@ -1,8 +1,9 @@
+import uuid
 from datetime import timedelta
 
 from django.test import TestCase
 
-from ..utils import GitRepo, mask_url, scheme_and_netloc_from_url, str2timedelta
+from ..utils import GitRepo, mail2uuid, mask_url, scheme_and_netloc_from_url, str2timedelta
 
 
 class UtilsTests(TestCase):
@@ -41,6 +42,10 @@ class UtilsTests(TestCase):
         for check in checks:
             self.assertEqual(check[1], scheme_and_netloc_from_url(check[0]))
 
+    def test_mail2uuid(self):
+        expected_uuid = uuid.UUID('c25334d0-9539-55e3-92b4-f559c384522b')
+        self.assertEqual(expected_uuid, mail2uuid('hub@cccv.de'))
+
 
 class GitRepoOfflineTests(TestCase):
     def test_invalid_url_local_path(self):
diff --git a/src/core/utils.py b/src/core/utils.py
index f7a3ca8cbd381d482afd5ffdb055597c2bf38656..e69123e006a352715a7ed5c3948f03bdb545808d 100644
--- a/src/core/utils.py
+++ b/src/core/utils.py
@@ -4,6 +4,7 @@ import re
 import shutil
 import subprocess
 import tempfile
+import uuid
 from datetime import UTC, datetime, timedelta
 from io import BytesIO
 from pathlib import Path
@@ -223,6 +224,11 @@ def download_from_url(url: str) -> Tuple[str, bytes]:
     return filename, data
 
 
+def mail2uuid(mail: str, prefix: str = 'acct:', suffix: str = '') -> uuid.UUID:
+    uri = prefix + mail + suffix
+    return uuid.uuid5(uuid.NAMESPACE_URL, uri)
+
+
 class GitCloneError(Exception):
     pass