commit dc3ebe6537d1fbe36f28f27d3ac07f81c05c8ea5
Author: SebastianDiel <sebastian.diel@web.de>
Date:   Mon Jun 5 14:46:25 2017 +0200

    stable, sorted output

diff --git a/src/entityinspector.cpp b/src/entityinspector.cpp
index 9efd3bd..52ae52c 100644
--- a/src/entityinspector.cpp
+++ b/src/entityinspector.cpp
@@ -31,6 +31,7 @@ EntityInspector::~EntityInspector() {
 
 bool EntityInspector::checkRegisteredEntities() {
     QStringList classes = EntityInstanceFactory::getRegisteredClasses();
+    classes.sort();
     QString msg = QDateTime::currentDateTime().toString(Qt::ISODate) +
                   " - Start checking entities\n";
     this->logger->logMsg(msg, MsgType::INFO);
@@ -90,8 +91,17 @@ Entity *EntityInspector::instantiateEntity(const QString name) {
 void EntityInspector::checkMetaProperties(QHash<QString, QMetaProperty>
         &metaProperties, bool &ok, QHash<QString, Relation> &relations) {
     QString msg = "";
+#ifdef DIFFABLEOUTPUT
+    QMap<QString, QMetaProperty> metaPropertiesMap;
+    for (auto i = metaProperties.constBegin(); i != metaProperties.constEnd();
+                ++i) {
+        metaPropertiesMap[i.key()] = i.value();
+    }
+    for (auto i = metaPropertiesMap.constBegin(); i != metaPropertiesMap.constEnd(); i++) {
+#else
     for (auto i = metaProperties.constBegin(); i != metaProperties.constEnd();
             ++i) {
+#endif
         QString typeName = QString(i.value().typeName());
         if (!i.value().isWritable()) {
             ok = false;
@@ -118,7 +128,15 @@ bool EntityInspector::verifyRelations(Entity *&entity) {
     auto relations = entity->getRelations();
     QString msg = "";
     this->checkMetaProperties(metaProperties, ok, relations);
+#ifdef DIFFABLEOUTPUT
+    QMap<QString, Relation> relationsMap;
+    for (auto i = relations.constBegin(); i != relations.constEnd(); i++) {
+        relationsMap[i.key()] = i.value();
+    }
+    for (auto i = relationsMap.constBegin(); i != relationsMap.constEnd(); ++i) {
+#else
     for (auto i = relations.constBegin(); i != relations.constEnd(); ++i) {
+#endif
         this->checkRelationTypos(i.key(), i.value(), ok);
         if (!metaProperties.contains(i.key())) {
             msg += "For relation " + i.key() + " no property exists!";
diff --git a/src/entitymanager.cpp b/src/entitymanager.cpp
index e788a9f..2fe3c23 100644
--- a/src/entitymanager.cpp
+++ b/src/entitymanager.cpp
@@ -223,6 +223,9 @@ bool EntityManager::save(QList<QSharedPointer<Entity>> &entities,
 
 bool EntityManager::startup(QString version, QStringList toInitialize,
                             bool createIndices) {
+#ifdef DIFFABLEOUTPUT
+    qSetGlobalQHashSeed(1);
+#endif
     QSharedPointer<Entity> dbm = QSharedPointer<DatabaseMigration>
             (new DatabaseMigration());
     QHash<QString, QVariant> map = QHash<QString, QVariant>();
diff --git a/src/logger.cpp b/src/logger.cpp
index 15b72b4..bf6b6f9 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -38,8 +38,12 @@ void Logger::lastError(const QSqlQuery &q, bool logQuery) {
     if (logQuery || q.lastError().isValid()) {
         const QString errorMsg = this->generateLogMsg(q.lastError());
         if (logQuery || !errorMsg.isEmpty()) {
-            QString msg = "{" + QString("\"time\":\"") +
-                          QDateTime::currentDateTime().toString(Qt::ISODate) + QString("\"") + errorMsg;
+            QString timeStamp;
+#ifndef DIFFABLEOUTPUT
+            timeStamp = QString("\"time\":\"") +
+                        QDateTime::currentDateTime().toString(Qt::ISODate) + QString("\"");
+#endif
+            QString msg = "{" + timeStamp + errorMsg;
             msg += this->generateLogMsg(q) + "}";
             this->logMsg(msg, errorMsg.isEmpty() ? MsgType::DEBUG : MsgType::WARNING);
         }
diff --git a/src/logger.h b/src/logger.h
index a2d99c5..b11597b 100644
--- a/src/logger.h
+++ b/src/logger.h
@@ -27,6 +27,7 @@ enum class MsgType { DEBUG, INFO, WARNING, CRITICAL, FATAL};
 class Logger {
 #ifdef QT_DEBUG
 #define DEFAULTMSGTYPE MsgType::DEBUG
+#define DIFFABLEOUTPUT
 #else
 #define DEFAULTMSGTYPE MsgType::CRITICAL
 #endif
