Brainstorm zu eignen Klassen in HashMap



  • Hallo Community,

    ich habe mir meine eigene StringKlasse mit eigenen Iteratoren gebaut und will diese in HashMap's verwenden.

    Dazu habe ich mit in meiner StringKlasse folgendes angelegt:

    namespace stdext
    {
    	inline size_t hash_value(const MyString& _Keyval) 
    	{	// hash _Keyval to size_t value one-to-one
    		size_t ret(2166136261U);
    
    		// Begin- und EndIterator
    		MyStringBase::const_iterator itBegin(_Keyval.begin());
    		MyStringBase::const_iterator itEnd(_Keyval.end());
    		while (itBegin != itEnd)
    		{
    			ret = 16777619U * ret ^ (size_t)*itBegin++;
    		}
    		return ret;
    	}
    };
    

    Das ganze funktioniert auch einwandfrei.

    Beim recherchieren im Internet zu diesem Thema bin ich allerdings immer auf andere Zahlen für die Erstinitalisierung bei

    // hash _Keyval to size_t value one-to-one
    size_t ret(2166136261U);
    

    und vorallem bei der Zeile für die multiplikation

    ret = 16777619U * ret ^ (size_t)*itBegin++;
    

    gestoßen. Dabei stieß ich auch darauf das es theoretisch möglich ist das der Schlüssel verschiedner Strings identisch sein können obwohl sie unterschiedlich sind. Was einleuchtet weil ja nur Werte multipliziert und addiert werden.

    Vorallem der Wert der Multiplikation reicht von der Zahl 31 bis u.a. auch zu der von mir angegeben 16777619U. Meine Frage hierzu wäre nun, mit welcher Zahl fahre ich am günstigen um eine möglichs hohe Chance zu haben das unterschiedliche Strings unterschiedelche Hashwerte erzeugen?? Ist die Chance hoher, wenn ich eine höhere Zahl benutze??



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten