refs #247 Removed hashing based on address, which is very wrong.

This commit is contained in:
Mathew Sutcliffe
2014-11-11 23:21:40 +00:00
parent a2c0a893c0
commit dae235881c

View File

@@ -66,89 +66,78 @@ namespace BlackMisc
uint CVariant::getValueHash() const uint CVariant::getValueHash() const
{ {
uint h = 0; uint h = 0;
if (!this->isValid() || this->isNull()) QVariant qv = this->toQVariant();
switch (qv.type())
{ {
QString hs; case QVariant::Int:
hs.sprintf("%p", this); h = ::qHash(qv.toInt());
h = ::qHash(hs); break;
} case QVariant::UInt:
else h = ::qHash(qv.toUInt());
{ break;
QVariant qv = this->toQVariant(); case QVariant::Bool:
switch (qv.type()) h = ::qHash(qv.toUInt());
break;
case QVariant::Double:
h = ::qHash(qv.toUInt());
break;
case QVariant::LongLong:
h = ::qHash(qv.toLongLong());
break;
case QVariant::ULongLong:
h = ::qHash(qv.toULongLong());
break;
case QVariant::String:
h = ::qHash(qv.toString());
break;
case QVariant::Char:
h = ::qHash(qv.toChar());
break;
case QVariant::StringList:
h = ::qHash(qv.toString());
break;
case QVariant::ByteArray:
h = ::qHash(qv.toByteArray());
break;
case QVariant::Date:
case QVariant::Time:
case QVariant::DateTime:
case QVariant::Url:
case QVariant::Locale:
case QVariant::RegExp:
h = ::qHash(qv.toString());
break;
case QVariant::Map:
case QVariant::List:
case QVariant::BitArray:
case QVariant::Size:
case QVariant::SizeF:
case QVariant::Rect:
case QVariant::LineF:
case QVariant::Line:
case QVariant::RectF:
case QVariant::Point:
case QVariant::PointF:
case QVariant::UserType:
case QVariant::Invalid:
h = 2; // known, but not supported
break;
default:
{ {
case QVariant::Int: // value object?
h = ::qHash(qv.toInt()); const QVariant qv = this->toQVariant();
break; const CValueObject *cv = CValueObject::fromQVariant(qv);
case QVariant::UInt: if (cv)
h = ::qHash(qv.toUInt());
break;
case QVariant::Bool:
h = ::qHash(qv.toUInt());
break;
case QVariant::Double:
h = ::qHash(qv.toUInt());
break;
case QVariant::LongLong:
h = ::qHash(qv.toLongLong());
break;
case QVariant::ULongLong:
h = ::qHash(qv.toULongLong());
break;
case QVariant::String:
h = ::qHash(qv.toString());
break;
case QVariant::Char:
h = ::qHash(qv.toChar());
break;
case QVariant::StringList:
h = ::qHash(qv.toString());
break;
case QVariant::ByteArray:
h = ::qHash(qv.toByteArray());
break;
case QVariant::Date:
case QVariant::Time:
case QVariant::DateTime:
case QVariant::Url:
case QVariant::Locale:
case QVariant::RegExp:
h = ::qHash(qv.toString());
break;
case QVariant::Map:
case QVariant::List:
case QVariant::BitArray:
case QVariant::Size:
case QVariant::SizeF:
case QVariant::Rect:
case QVariant::LineF:
case QVariant::Line:
case QVariant::RectF:
case QVariant::Point:
case QVariant::PointF:
case QVariant::UserType:
case QVariant::Invalid:
h = 2; // known, but not supported
break;
default:
{ {
// value object? h = cv->getValueHash();
const QVariant qv = this->toQVariant(); }
const CValueObject *cv = CValueObject::fromQVariant(qv); else
if (cv) {
{ // no value object
h = cv->getValueHash(); Q_ASSERT(false);
}
else
{
// no value object
QString hs;
hs.sprintf("%p", this);
h = ::qHash(hs);
}
} }
break;
} }
break;
} }
return h; return h;
} }