[graphics/digikam] /: Uses QSet instead QList to prepare build fingerprints and speed-up pre-processing with large collections.

Gilles Caulier <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit b06de7a3eda2478500c73ca56aecbf010566b08a by Gilles Caulier.
Committed on 17/08/2026 at 22:22.
Pushed by cgilles into branch 'master'.

Uses QSet instead QList to prepare build fingerprints and speed-up pre-processing with large collections.
BUGS: 524383
FIXED-IN: 9.2.0

M  +1    -1    NEWS
M  +4    -10   core/utilities/maintenance/tools/fingerprints/fingerprintsgenerator.cpp

https://invent.kde.org/graphics/digikam/-/commit/b06de7a3eda2478500c73ca56aecbf010566b08a

diff --git a/NEWS b/NEWS
index d7ff969aa1..c8332e5489 100644
--- a/NEWS
+++ b/NEWS
@@ -69,7 +69,7 @@ BUGFIXES:
 043 --> 524196 - Solved for me after performing the mention steps.
 044 --> 524254 - Unable to add /usr/bin/tesseract binary to digiKam.
 045 --> 511758 - digiKam is almost unusable when mysql is not connected over lan.
-046 --> 
+046 --> 524383 - Fingerprint maintenance stuck at 0% for hours on large collections — calculateAffectedAlbums() is O(N²) due to QList::contains() per item.
 047 --> 
 048 --> 
 049 --> 
diff --git a/core/utilities/maintenance/tools/fingerprints/fingerprintsgenerator.cpp b/core/utilities/maintenance/tools/fingerprints/fingerprintsgenerator.cpp
index e81668a729..d16eb9aeb9 100644
--- a/core/utilities/maintenance/tools/fingerprints/fingerprintsgenerator.cpp
+++ b/core/utilities/maintenance/tools/fingerprints/fingerprintsgenerator.cpp
@@ -55,7 +55,7 @@ public:
 
     AlbumList            albumList;
 
-    QList<qlonglong>     allItemIds;
+    QSet<qlonglong>      allItemIds;
 
     QFuture<void>        affectedAlbumTask;
     QFutureWatcher<void> affectedAlbumWatcher;
@@ -137,7 +137,7 @@ void FingerPrintsGenerator::slotAffectedAlbumsFinished()
 
     setTotalItems(d->allItemIds.count());
 
-    d->thread->generateFingerprints(d->allItemIds, d->rebuildAll);
+    d->thread->generateFingerprints(d->allItemIds.values(), d->rebuildAll);
     d->thread->start();
 }
 
@@ -159,10 +159,7 @@ void FingerPrintsGenerator::calculateAffectedAlbums()
 
             for (const qlonglong& id : ids)
             {
-                if (!d->allItemIds.contains(id))
-                {
-                    d->allItemIds << id;
-                }
+                d->allItemIds.insert(id);
             }
         }
         else if ((*it)->type() == Album::TAG)
@@ -171,10 +168,7 @@ void FingerPrintsGenerator::calculateAffectedAlbums()
 
             for (const qlonglong& id : ids)
             {
-                if (!d->allItemIds.contains(id))
-                {
-                    d->allItemIds << id;
-                }
+                d->allItemIds.insert(id);
             }
         }
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.