<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ideen gesucht: Hash funktion für vektoren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade auf der suche nach einer effizienten Hash funktion für folgendes:<br />
Man hat einen vektor gefüllt mit double werten. Wurde der vektor noch nicht in früheren berechnungen einmal benutzt speichere ich ihn ins hash. Wenn doch kann ich<br />
einfach den berechneten wert der unter dem schlüssel zu finden ist hernehmen.<br />
Wichtig: Alle vektoren haben die gleiche grösse z.B 5 Werte. d.h. 5 x 1 Struktur</p>
<p>Bisher bin ich nur auf solch triviale schlüsselerstellung gekommen:</p>
<ol>
<li>Einfach die summe der elemente nehmen und die als schlüssel speichern. Sehr kollisionsanfällig.</li>
<li>summe aller multiplikationen von element mit index</li>
</ol>
<p>Diese Ansätze sind natürlich ineffizient und kollisionsanfällig.<br />
Ich brauche einen performanten (vor allem hinsichtlich Zeit) Ansatz.</p>
<p>Wenn jemand evtl. Links oder Ideen hat bin ich sehr dankbar!</p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161762/ideen-gesucht-hash-funktion-für-vektoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 20:00:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161762.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Oct 2006 22:00:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Tue, 10 Oct 2006 22:00:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade auf der suche nach einer effizienten Hash funktion für folgendes:<br />
Man hat einen vektor gefüllt mit double werten. Wurde der vektor noch nicht in früheren berechnungen einmal benutzt speichere ich ihn ins hash. Wenn doch kann ich<br />
einfach den berechneten wert der unter dem schlüssel zu finden ist hernehmen.<br />
Wichtig: Alle vektoren haben die gleiche grösse z.B 5 Werte. d.h. 5 x 1 Struktur</p>
<p>Bisher bin ich nur auf solch triviale schlüsselerstellung gekommen:</p>
<ol>
<li>Einfach die summe der elemente nehmen und die als schlüssel speichern. Sehr kollisionsanfällig.</li>
<li>summe aller multiplikationen von element mit index</li>
</ol>
<p>Diese Ansätze sind natürlich ineffizient und kollisionsanfällig.<br />
Ich brauche einen performanten (vor allem hinsichtlich Zeit) Ansatz.</p>
<p>Wenn jemand evtl. Links oder Ideen hat bin ich sehr dankbar!</p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1152503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1152503</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 10 Oct 2006 22:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Tue, 10 Oct 2006 22:10:16 GMT]]></title><description><![CDATA[<pre><code>h=0
for each e in vector
  h=(h*31)+hash(e)
return h
</code></pre>
<p>*31 sollte recht fix gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1152508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1152508</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 10 Oct 2006 22:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Tue, 10 Oct 2006 22:14:47 GMT]]></title><description><![CDATA[<p>danke<br />
wären bit-operationen net schneller?<br />
ich hab mal was von zobrist-keys gelesen...die haben da gewaltige datenmengen über 64 bit zufallszahlen die sie geodert haben...<br />
vielleicht irgendwie übertragbar auf mein problem? über eine 64-bit Zufallszahl logisch &quot;ge-odert&quot; z.B. mit der summe der vektor elemente? Oder wäre das zu teuer ...</p>
<p>warum eigentlich 31 ? Primzahl?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1152512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1152512</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 10 Oct 2006 22:14:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Tue, 10 Oct 2006 22:59:39 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>wären bit-operationen net schneller?</p>
</blockquote>
<p>+ ist nicht lahmer als ^. ist aber oft ein wenig besser, damit man nicht immer ein X an stelle i und ein X an stelle i+32 sich genau aufheben.</p>
<blockquote>
<p>ich hab mal was von zobrist-keys gelesen...die haben da gewaltige datenmengen über 64 bit zufallszahlen die sie geodert haben...</p>
</blockquote>
<p>zobrist-hashing hat nen andere zweck. da soll ermöglicht werden, daß in einem großen vektor, sagen wie mal 100 einträgen, der eintrag an stelle 73 einen anderen wert bekommen kann und man kann sofort den neuen hashwert des ganzen vektors neuberechnen. genauer: bei vektoren der größe n muß man auch mit zobrist den hashwert in O(n) berechnen. aber beim ändern nur eines vektor-elements kann man den hashwert dann in O(1) updaten.</p>
<pre><code>vielleicht irgendwie übertragbar auf mein problem? über eine 64-bit Zufallszahl logisch &quot;ge-odert&quot; z.B. mit der summe der vektor elemente? Oder wäre das zu teuer ...
</code></pre>
<p>übertragbar isses. aber nicht schneller, würde ich meinen.</p>
<blockquote>
<p>warum eigentlich 31 ? Primzahl?</p>
</blockquote>
<p>a) speed<br />
weil der compiler aus<br />
i<em>31<br />
lieber<br />
i</em>32-i<br />
und daraus<br />
(i&lt;&lt;5)-i<br />
macht.<br />
stell dir mal i*161 vor, wie schill das mit shiften wäre. und ne integer-multiplikation ist im moment noch zu teuer (oder ich bin zu geizig).</p>
<p>b) ungerade zahl (primzahl ist gar nicht nötig, sie muss nur ungerade sein, um mit 2^32 oder 2^64 relativ prim zu sein und in unserem minizufallszahlengenerator die volle periode aufspannen kann). (eine überlegung, die bei zobrist nicht eingehen würde). und viel wichtiger: ungerade zahl: da plumpsen die bits nicht alle raus.<br />
stell dir nur mal i*256 vor und 32-bittige hashvalues. das wäre eine hashfunktion, die nur die letzten 4 elemente kennt und alle älteren vergessen hat. vom ersten element sind sicher alle bits weg, rausgeshiftet.</p>
<p>c) vermischung<br />
dadurch, daß die alte zahl zweimal auf die neue geworfen wird, weimla mit plus um 5 stellen verschoben und einmal mit minus ohne verschiebung, sind am ende von einem bit im eingang viele bits im ausgang betroffen. das macht gute hashfunktionen aus. die vermischung wäre mit lustigen zahlen wie 0x9E3779B1 noch viel besser, aber das mag ich hier nicht bezahlen.</p>
<p>d) die verschiebungsweite 5 der meisten bits mit &lt;&lt;5 ist relativ prim zur bitbreite der hashkeys (32 oder 64). das bringt wieder alle bits ins spiel. bei nicht selten vorkommenden eingangsfolgen, die nur im letzuten bit wackeln, daß die letzten (und die einig aktiven bits) und lustiger verschiebungsbreite 8 sind nur 4 oder 8 bist im ergebnis betriffen, egal wie lang der vektor ist. wäre schon netter, wenn alle 32 oder 64 bits mitspielen dürfen.</p>
<p>da ich aber nicht weiß, wie du die doubles hasht, kann ich dir nicht sagen, wie ich es machen würde, die vektoren zu hashen.</p>
<p>statt<br />
h=h<em>31+hash(e)<br />
ist vielleicht<br />
h=h+31</em>hash(e)<br />
zu bevorzugen, weil das auch den letzten wert mit *31 ein wenig durchmischt. dann braucht hash(double) nicht mehr so stark zu sein (hauptsache, sie bringt möglichst viele bits mit, sie muß aber nicht so arg schlimm verwürfeln). ich würde mich trauen, u32 hash(double x){return *(u32*)&amp;x;} zu schreiben. bei doch noch kollissionen, die über den bloßen zufall hinausgehen, würde ich aus return h; ein return h*0x9E3779B1; machen. also pro vektor nur einmal ne integer-multiplikation am ende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1152517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1152517</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 10 Oct 2006 22:59:39 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Wed, 11 Oct 2006 21:14:51 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>also ohne schleimerisch zu wirken...<br />
Hut ab! So ne Bomben Antwort hab ich nicht erwartet - sie zeigt nur wie wenig ich eigentlich noch weiß *grmpf</p>
<p>Danke volkard - ich bin noch am verstehen deiner antwort bis ich evtl. mehr darauf eingehen kann...:)</p>
<p>EDIT:</p>
<p>ich finde nur spärlich in der sufu und google was zu hash maps unter c++. Ich bin mir im moment unsicher ob es überhaupt einen stl container hash_map nun gibt oder net? Habe auch was mit include &lt;unordered_map&gt; gelesen??? Da sind aber bereits die Hash-funktionen verbaut oder? Also da wir der Zugriff selbst bereits gesteuert und da müsste man keine eigene hash funktion mehr basteln?</p>
<p>Falls ich den schritt selbst wagen wollen würde ...auf was sollte ich dann wohl operieren? ich habe gerade schwierigkeiten mir vorzustellen wie ich eine eigene hash-funktion auf eine datenstruktur anwenden sollte? std::map hat ja wohl ne eigene ?? irgendwie mit nem 2D array?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153113</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Wed, 11 Oct 2006 21:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Thu, 12 Oct 2006 21:12:50 GMT]]></title><description><![CDATA[<p>Ich habe Probleme einen Begin zu starten...vielleicht hat jemand eine gute Idee...<br />
Mein Problem hat sich nun so verändert:</p>
<p>Ich habe immer einen Vektor mit mehreren verschiedenen double werten z.B so:</p>
<p>v1 = [-2.5, 3.0, 0.0, -6.0, 7.3]</p>
<p>und immer einen zugehörigen 2ten vektor der ein einheitsvektor ist. z.B so:</p>
<p>e1 = [0.0, 0.0, 0.0, 1.0, 0.0]</p>
<p>Aus diesen 2 eingaben wird zusätzlich folgendes errechnet:<br />
* aus v1 wird eine qr zerlegung gemacht also v1 wird verändert und hat neue werte<br />
* ein weiterer vektor mit double werten (wie er errechnet wird ist egal) - sieht z.B so aus: t1 = [-3.889, 2.56, 0.0]<br />
* ein 2ter weiterer vektor mit double werten z.B m1 = [-9.004, 8.0]</p>
<p>UNd folgendes wird am Ende gebraucht:<br />
* ein vektor der nur aus 0en und 1en besteht: p1 = [1,0,0,1,0]</p>
<p>Nun zum Hashing:<br />
Am Anfang würde ich gerne testen ob eine Berechnung bereits einmal stattgefunden hat. Wenn also v1 schon mal berechnet wurde UND e1 gleich ist also beide vektoren schonmal für eine berechnung verwendet wurden dann gib mir einfach nur das berechnete m1 und p1 zurück.<br />
Falls aber NUR v1 verwendet wurde aber z.B e2 so aussieht: e2 = [1.0,0.0,0.0,0.0,0.0]<br />
dann gibt mir bitte nur das neue v1 (die qr zerlegung) zurück und zusätzlich t1 und p1. Jetzt wird die berechnung gestartet um m1 zu berechnen.</p>
<p>Nochmal vielleicht in pseudocode:</p>
<pre><code>if v1' == v1:
     if e1' == e1:
             return m1 &amp;&amp; return p1
     else:
             return v1 &amp;&amp; return t1 &amp;&amp; return p1 -&gt; und führe die berechnung weiter mit diesen werten fort um m1 zu berechnen
else:
     berechne erst das neue v1 und t1 und daraus das neue m1 UND speichere alle ergebnisse im hash
</code></pre>
<p>Jetzt kommt der Knackpunkt:<br />
Das nachschauen ob etwas berechnet wurde will ich mit einem Hash realisieren.<br />
Nur frage ich mich wie ich das eindeutig ohne kollisionen bewerkstelligen kann?<br />
ich müsste also den schlüssel irgendwie aus den elementen von v1 und e1 bauen???<br />
e1 könnte man einfach nur als reinen integer sehen an welcher stelle sich die &quot;1&quot; befindet!<br />
Dann wüsste ich nicht wie ich mehrere vektoren im hash speichern sollte also der zugriff z.B nur auf t1 ...? also sowas mein ich: t1 = hash[key] und m1 = hash[key] wobei key gleich ist...also unter demselben schlüssel gäbe es ja eine reihe von vektoren die zu speichern wären...??? Evtl. in einer structure speichern und diese structure im hash speichern?</p>
<p>Zusätzlich bräuchte ich Hilfe welches hash ich nehmen sollte....ich glaube nicht dass eine einfach stl::map da ausreicht oder? Ist der zugriff da schnell? Wenn ich eine eigenen hash- funktion haben will was ich ja evtl. brauche um den schlüssel zu generieren sollte ich da nicht evtl. sowas wie hash_map verwenden?<br />
Und wenn ich sogar eine eigene Implementierung eines hashes brauche - (was ich nicht hoffe) welche datenstruktur müsste ich dann hernehmen? ein Array? Evtl. 2-dimensional?</p>
<p>Für Hilfe bin ich sehr dankbar! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>EDIT: habe gerade ein hash_map zum laufen gebracht.<br />
wäre folgende variante sinnvoll um vectoren zu speichern?</p>
<pre><code>struct myStruct 
{
       std::vector&lt;double&gt; v1;
       std::vector&lt;double&gt; t1;
       int col;
       int size;
       std::vector&lt;double&gt; m1;
}

hash_map&lt;int, myStruct&gt; hmap;
</code></pre>
<p>oder wäre es besser in der structure nur pointer zu speichern? Hab mal gelesen<br />
dass pointer speichern in containern schwachsinn ist.....oder hab ich fehlinformationen?<br />
Aber so würde die structure ziemlich viel speicher fressen....obwohl - käme auf gleiche raus oder?</p>
<p>zusätzlich habe ich gelesen dass es sinnvoll ist laut SGI eine eigene hash funktion zu haben. da wäre wir wieder da wo wir angefangen haben. Könnte ich einfach die von volkard beschriebene funktion fürs irgendwie anwenden?<br />
laut sgi gibts ja sowas:</p>
<p><a href="http://www.sgi.com/tech/stl/hash_map.html" rel="nofollow">http://www.sgi.com/tech/stl/hash_map.html</a></p>
<p>so ganz komm ich mit der hash funktion noch net klar als erstes beispiel von volkard:</p>
<pre><code>h=0 
 for each e in vector 
   h=(h*31)+hash(e) 
 return h
</code></pre>
<p>das hash(e) verstehe ich net: ist das der zugriff aufs hash mit dem schlüssel e? also wird hir der wert der im hash unter e gespeichert ist verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153832</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 12 Oct 2006 21:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 06:22:11 GMT]]></title><description><![CDATA[<p>Ne, das ist sozusagen das hashen von Vektoren zurückgeführt auf das hashen von einzelnen doubles. Du brauchst also noch ne hashfunktion für doubles. Sowas dürfte aber dabei sein. Du mußt nur rausfinden wie's heißt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153979</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 13 Oct 2006 06:22:11 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 08:45:31 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>Das nachschauen ob etwas berechnet wurde will ich mit einem Hash realisieren.<br />
Nur frage ich mich wie ich das eindeutig ohne kollisionen bewerkstelligen kann?</p>
</blockquote>
<p>wir verkaufen dir nur was mit &quot;wenigen&quot; kollissionen. kollisionsfreiheit kriegste nur, wenn der hashkey genausolang ist wie die nutzdaten. und dann kann man auch gleich die nutzdaten vergleichen statt zu hashen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154071</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 13 Oct 2006 08:45:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 13:45:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Du brauchst also noch ne hashfunktion für doubles</p>
</blockquote>
<p>sorry für meine verwirrung aber Jetzt versteh ichs noch weniger .... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
ich habe im Moment folgendes am laufen:</p>
<pre><code class="language-cpp">namespace __gnu_cxx
{
    template&lt;&gt; struct hash&lt; std::string &gt;
    {
        size_t operator()( const std::string&amp; x ) const
        {
            return hash&lt; const char* &gt;()( x.c_str() );
        }
    };
}

struct eqint
{
    bool operator()(int d1, int d2) const
    {
        return  d1 == d2;
    }
};

struct MyHash
{
    int operator()(const int key) const
    {
        std::cout &lt;&lt; &quot;in der hash-function&quot; &lt;&lt; std::endl;
        int ret = 0;
        ret = static_cast&lt;int&gt; (fabs(key));
        return ret;  
    }
};

Class::Class()
{
    __gnu_cxx::hash_map&lt;int, double, MyHash, eqint&gt; hash;

    hash[0] = 3.0;
    hash[1] = 2.5;
    hash[2] = 15.3;

    std::cout &lt;&lt; &quot;   -&gt; &quot; &lt;&lt; hash[2] &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;   -&gt; &quot; &lt;&lt; hash[1] &lt;&lt; std::endl;
}
</code></pre>
<p>so läuft es auch...wobei ich mir unsicher bin ob ich da nicht intern was falsch mache...</p>
<p>ich habe in der hash_map also &quot;int&quot; für die schlüssel.<br />
den schlüssel wollte ich aus dem vektor errechnen über die hash-funktion MyHash...wobei im Moment nur ein fabs drin is.<br />
das eqint dachte ich überprüft eben auf gleiche schlüssel dachte ich...</p>
<p>nur frage ich mich wie ich nun z.B eine funktion wie volkard sie präsentiert hat da mit reinziehen könnte....</p>
<p>so doch nicht:</p>
<pre><code>h=0 
 for each e in vector 
   h=(h*31)+eqint(e) 
 return h
</code></pre>
<p>irgendwie verstehe ich da was falsch...<br />
die hash-funktion ist doch die abbildung des schlüssels auf das hash. also sie errechnet mir die stelle wo meine daten drin stehen oder?<br />
Und UM einen schlüssel zu errechnen rufe ich doch AUCH dies hash-funktion auf?<br />
der vergleich müsste doch dann nur über die eqint funktion gehen in diesem fall:<br />
hier mal die Links zu SGI:</p>
<p><a href="http://www.sgi.com/tech/stl/hash_map.html" rel="nofollow">http://www.sgi.com/tech/stl/hash_map.html</a><br />
<a href="http://www.sgi.com/tech/stl/hash.html" rel="nofollow">http://www.sgi.com/tech/stl/hash.html</a></p>
<p>hier<br />
<a href="http://www.astro.uni-wuerzburg.de/~asmaier/usefulthings/c++.pdf" rel="nofollow">http://www.astro.uni-wuerzburg.de/~asmaier/usefulthings/c++.pdf</a><br />
wird auf seite 271 genau dies gemacht....</p>
<p>nur verstehe ich im moment auch net warum überhaupt eine vergleichsfunktion da sein muss...denn entweder der key ist enthalten oder nicht ? er vergleicht doch nicht zuerst jeden hash key mit dem neuen key?</p>
<p>oder ist es so dass ich 2 Hashfunktionen brauche? Eine die mir den doublewert gleichverteilt macht und die eine die dann auf das hash mapped???</p>
<p>kann mir jemand behilflich sein?<br />
Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154088</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 13 Oct 2006 13:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 15:16:44 GMT]]></title><description><![CDATA[<p>mir fällt gerade auf...wenn ich einen vektor mit double werten als eingabe habe, wie soll ich denn da überhaupt sinnvollerweise ein hashing implementieren...<br />
auf double werten bin ich ja wirklich nur äusserst selten dann auch identisch oder?<br />
müsste ich da nicht auf eine untere schranke testen ob die einträge identisch sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154216</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 13 Oct 2006 15:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 15:29:47 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>mir fällt gerade auf...wenn ich einen vektor mit double werten als eingabe habe, wie soll ich denn da überhaupt sinnvollerweise ein hashing implementieren...</p>
</blockquote>
<p>behandle den vector doch als array von longs. müsste aufgehen, wenn doubles aus 8 bytes bestehen. dann brauchste auch keine langsamen double-&gt;int konvertierugen (es soll ja schnell sein). für sowas gibt's massenweise fertige implementierungen (such mal bei google nach 'message authentication code'). wenn's wenig kollisionen haben soll könnteste auch auch sowas wie 'sha1' nehmen, aber das ist leider viel langsamer als 'hash = hash*31+x'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154231</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Fri, 13 Oct 2006 15:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 15:34:36 GMT]]></title><description><![CDATA[<p>danke net aber um ehrlich zu sein verstehe ich das nicht:</p>
<blockquote>
<p>behandle den vector doch als array von longs. müsste aufgehen, wenn doubles aus 8 bytes bestehen.</p>
</blockquote>
<p>wie meinst du als long behandeln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154238</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 13 Oct 2006 15:34:36 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 16:17:51 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>wie meinst du als long behandeln?</p>
</blockquote>
<p>etwa so:</p>
<pre><code>// viele doubles...
double d[] = {1.1, 2.2, 3.3, ...};
...
// hashfunktion braucht pointer auf startadresse und anzahl der longs
hashwert = hash_long_vector ((long*)d, sizeof(d)/sizeof(long)); 
...
</code></pre>
<p>so 'ner hashfunktion ist es ja egal, ob das mal fliesskommawerte waren oder irgendwas anderes <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154275</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Fri, 13 Oct 2006 16:17:51 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 16:46:31 GMT]]></title><description><![CDATA[<p>danke...<br />
aber hmm...<br />
würden dann folgende 2 arrays unterschiedliche schlüssel generieren?</p>
<p>d1= {1.1, 2.2,3.3}<br />
d2 = {1.0,2.2,3.3}</p>
<p>?<br />
sorry...ich blick da noch immer net ganz durch...du castest auf long und berechnest die anzahl der longs im vectors und übergibst beides?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154292</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Fri, 13 Oct 2006 16:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Fri, 13 Oct 2006 16:53:08 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>danke...<br />
aber hmm...<br />
würden dann folgende 2 arrays unterschiedliche schlüssel generieren?<br />
d1= {1.1, 2.2,3.3}<br />
d2 = {1.0,2.2,3.3}<br />
?</p>
</blockquote>
<p>ja, genau. sobald sich das kleinste bit unterscheidet gibt's (mit hoher wahrscheinlichkeit) einen andere hashwert.</p>
<p>Mati schrieb:</p>
<blockquote>
<p>sorry...ich blick da noch immer net ganz durch...du castest auf long und berechnest die anzahl der longs im vectors und übergibst beides?</p>
</blockquote>
<p>jo, geht auch mit ints, bytes etc. je nachdem wie's die hashfunktion haben will...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154297</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Fri, 13 Oct 2006 16:53:08 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sat, 14 Oct 2006 20:47:51 GMT]]></title><description><![CDATA[<p>ajajaj...ich schaffe es einfach nicht den transver von deinem vorschlag net auf die von volkard vorgeschlagene hash funnktion zu übertragen...</p>
<p>könnte mir jemand irgendwie behilflich sein?</p>
<pre><code>h=0 
 for each e in vector 
   h=(h*31)+hash(e) 
 return h
</code></pre>
<p>ich begreife immer noch nicht genau was dieses hash(e) macht....?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154848</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sat, 14 Oct 2006 20:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sun, 15 Oct 2006 01:14:09 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>ich begreife immer noch nicht genau was dieses hash(e) macht....?</p>
</blockquote>
<p>ich dachte dabei an sowas:</p>
<pre><code class="language-cpp">typedef unsigned int uint32;//oder ähnlich, je nach compiler
typedef unsigned long long uint64;//dito

inline uint32 hash(double x){
   uint64* p=reinterpret_cast&lt;uint64*&gt;(&amp;x);
   return *p ^ (*p&gt;&gt;32);
}
</code></pre>
<p>in der annahme, daß die hashtable 32-bittige hashwerte mag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1154914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1154914</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 15 Oct 2006 01:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sun, 15 Oct 2006 20:40:54 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
tjoa danke...</p>
<p>Mit einem Apell an eure geduld:</p>
<blockquote>
<p>uint64* p=reinterpret_cast&lt;uint64*&gt;(&amp;x);<br />
return *p ^ (*p&gt;&gt;32);</p>
</blockquote>
<p>ich werde wohl erstmal einen dicken schinken zum compilerbau lesen demnächst damit ich sowas auch verstehe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>EDIT: ich nehme an dass *p &gt;&gt; 32 das mappen des 64 bit schlüssel auf einen uint 32 bit ist oder? aber warum XOR mit dem ausgangsschlüssel? Um den wert definitiv eideutig zu halten?<br />
Zusätzlich: Sind reinterpret_casts net gefährlich?</p>
<p>Nur so damit ich mal das grobe verstehe...verstehe ich das richtig das im grunde die hash-funktion jetzt die funktion &quot;hash&quot; für double werte aufruft? Also 2 Funktionen um den schlüssel aus einem vektor zu generieren?</p>
<p>Ich versuche es im moment so:</p>
<pre><code class="language-cpp">struct MyHash
{
    int operator()(const double key) const
    {        
        int ret = 0; 
        //for each e in vector 
        ret = (ret * 31) + hash_d(key);
        std::cout &lt;&lt; &quot;Der key: &quot; &lt;&lt; ret &lt;&lt; std::endl;
        return ret;
    }

    inline uint32 
    hash_d(double x) const
    { 
        uint64* p=reinterpret_cast&lt;uint64*&gt;(&amp;x); 
        return *p ^ (*p&gt;&gt;32); 
    }
};

struct HASH_DATA
{
    std::vector&lt;double&gt; A_hat;
    std::vector&lt;double&gt; m_k_hat;
    int unit_vec_size;
    int unit_vec_row;   
};

//in einer methode einfach nur testbeispiel
...
    hash_map&lt;double, HASH_DATA, MyHash&gt; hash;

    struct HASH_DATA hd;
    std::vector&lt;double&gt; a;
    a.push_back(2.0);
    a.push_back(2.9);
    std::vector&lt;double&gt; b;
    b.push_back(1.0);
    b.push_back(1.9);
    hd.A_hat = a;
    hd.m_k_hat =b;
    hd.unit_vec_row = 2;
    hd.unit_vec_size = 1;
    hash[3.8] = hd;
    hash[3.7] = hd;

//
</code></pre>
<p>davon ist einer der hash werte so : -644612093<br />
dumme frage aber hash werte - können die negativ sein? bin gerade etwas durcheinander weil bei arrays gehts ja net <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber eigentlich sollten solche werte net auftauchen weil volkard ja mit unsigned arbeitet<br />
oder?<br />
UNd die Zahlen sind ja ziemlich groß...aber immer noch im wertebereich von unsigned int...oder?<br />
Aber irgendwie scheints zu funktionieren...also<br />
2.9999999999<br />
2.9999999999<br />
3.0000000000</p>
<p>ergeben die ersten beiden identische schlüssel und<br />
die 3.0 dann nen völlig anderen...auch wenn die schlüssel gewaltig sind UND eben manchmal negativ...müsste doch passen oder?</p>
<p>Danke für eure geduld</p>
<p>EDIT:<br />
müsste die schlüsselberechnung net evtl. so aussehen:</p>
<pre><code class="language-cpp">uint32 operator()(const double key) const
    {        
        uint32 ret = 0; 
        //for each e in vector 
        ret = (ret * 31) + hash_d(key);
        std::cout &lt;&lt; &quot;Der key: &quot; &lt;&lt; ret &lt;&lt; std::endl;
        return ret;
    }
</code></pre>
<p>also den rückgabewert des operators auf uint32??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155264</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sun, 15 Oct 2006 20:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sun, 15 Oct 2006 19:50:21 GMT]]></title><description><![CDATA[<p>hab irgendwie ne handvoll posts ueberlesen, sorry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155274</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 15 Oct 2006 19:50:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sun, 15 Oct 2006 20:15:37 GMT]]></title><description><![CDATA[<p>kein problem - ich bin ja froh dass mir jemand hilft <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155280</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sun, 15 Oct 2006 20:15:37 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sun, 15 Oct 2006 21:02:14 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>EDIT: ich nehme an dass *p &gt;&gt; 32 das mappen des 64 bit schlüssel auf einen uint 32 bit ist oder? aber warum XOR mit dem ausgangsschlüssel? Um den wert definitiv eideutig zu halten?</p>
</blockquote>
<p>einfach ein return *p; würde von dem 64-bittigen *p nur die unteren 32 bits nehmen für den returnwert, der nur 32 bit hat.<br />
deswegen haben ich mit *p&gt;&gt;32 auch noch die oberen 32 bits dazugemixt.</p>
<blockquote>
<p>Zusätzlich: Sind reinterpret_casts net gefährlich?</p>
</blockquote>
<p>undefiniertes verhalten. jo. musst halt testen, ob das auf deinem compiler geht.</p>
<blockquote>
<p>Nur so damit ich mal das grobe verstehe...verstehe ich das richtig das im grunde die hash-funktion jetzt die funktion &quot;hash&quot; für double werte aufruft?</p>
</blockquote>
<p>jo.</p>
<blockquote>
<p>Also 2 Funktionen um den schlüssel aus einem vektor zu generieren?</p>
</blockquote>
<p>jo.</p>
<blockquote>
<p>davon ist einer der hash werte so : -644612093<br />
dumme frage aber hash werte - können die negativ sein? bin gerade etwas durcheinander weil bei arrays gehts ja net <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>du hast den hashcode in einen int gesteckt statt in einen unsigned int vor dem ausgeben. ist aber nicht schlimm, es sind ja alle bits da. nur die anzeige ist komisch.</p>
<blockquote>
<p>Aber irgendwie scheints zu funktionieren...also</p>
</blockquote>
<p>na, das ferut mich jetzt.</p>
<blockquote>
<p>müsste die schlüsselberechnung net evtl. so aussehen:</p>
<pre><code class="language-cpp">uint32 operator()(const double key) const
    {        
        uint32 ret = 0; 
        //for each e in vector 
        ret = (ret * 31) + hash_d(key);
        std::cout &lt;&lt; &quot;Der key: &quot; &lt;&lt; ret &lt;&lt; std::endl;
        return ret;
    }
</code></pre>
<p>also den rückgabewert des operators auf uint32??</p>
</blockquote>
<p>jo, das sieht ganz lecker aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155310</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 15 Oct 2006 21:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Sun, 15 Oct 2006 21:12:20 GMT]]></title><description><![CDATA[<p>An dieser Stelle großes Dankeschön - v.a. auch an volkard!<br />
Es haut jetzt so hin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155314</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sun, 15 Oct 2006 21:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Mon, 16 Oct 2006 00:50:27 GMT]]></title><description><![CDATA[<blockquote>
<p>undefiniertes verhalten. jo. musst halt testen, ob das auf deinem compiler geht.</p>
</blockquote>
<p>implementation defined != undefined<br />
Das Erbebnis eines reinterpret_cast ist in den meisten Fällen soweit ich mich erinnere implementation defined und nicht undefined.</p>
<p>Oder irre ich mich jetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155350</guid><dc:creator><![CDATA[Plotzenhotz]]></dc:creator><pubDate>Mon, 16 Oct 2006 00:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Mon, 16 Oct 2006 01:07:56 GMT]]></title><description><![CDATA[<p>Plotzenhotz schrieb:</p>
<blockquote>
<p>implementation defined != undefined</p>
</blockquote>
<p>ja, reinterpret_cast ist implementation-defined.<br />
ok, es kommt ein implementation-defined pointer to uint64 raus.</p>
<p>mal gucken, on der zugriff auf diese adresse dann undefined oder implementation-defined oder noch was anderes ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1155351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1155351</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 16 Oct 2006 01:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Thu, 19 Oct 2006 20:09:19 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich bin es noch einmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>je mehr ich darüber nachdenke desto weniger verstehe ichs - sorry an der stelle nochmal aber ich will den code wirklich auch verstehen.</p>
<p>von volkard diese funktion um double werte zu hashen:</p>
<pre><code class="language-cpp">inline U_Int32 
    hash_d(double x) const
    { 
        U_Int64* p = reinterpret_cast&lt; U_Int64* &gt; (&amp;x); 
        return *p ^ (*p &gt;&gt; 32); 
    }
</code></pre>
<p>ich verstehe die bearbeitung nicht.<br />
* WIr nehmen die Adresse von x was doch ein 32 Bit Typ ist Oder?<br />
* Dann casten wir durch reinterpret cast auf 64 Bit Pointer...d.h unser p ist ein Pointer<br />
auf die zu 64 BIt erweiterte Adresse von p ?<br />
* Und dann schieben wir die ersten 32 Bit (waren das die 32 Bit vom anfang? Also werden durch den cast 0er angehängt?) wieder nach hinten<br />
* Und anschließend XOR mit dem geschobenen wert damit wir 2mal sozusagen die Bits hintereinander bekommen? Also ein kurzbeispiel:</p>
<ol>
<li>1001</li>
<li>1001 0000</li>
<li>0000 1001</li>
<li>0000 1001 ^ 1001 0000 = 1001 1001</li>
</ol>
<p>Aber der rückgabewert ist doch ein 32 Bit Typ?</p>
<p>ich glaube ich versteh hier was falsch oder???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157948</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 19 Oct 2006 20:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Ideen gesucht: Hash funktion für vektoren on Thu, 19 Oct 2006 21:38:03 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>* Dann casten wir durch reinterpret cast auf 64 Bit Pointer...d.h unser p ist ein Pointer</p>
</blockquote>
<p>nee. wie casten auf einen 32-bittigen pointer auf einen 64-bittigen integer.</p>
<p>p hat 32 bit.</p>
<p>aber *p hat 64 bit.</p>
<p>ich mach mal ne zwischenvariable rein. aus</p>
<pre><code class="language-cpp">inline U_Int32 
    hash_d(double x) const
    { 
        U_Int64* p = reinterpret_cast&lt; U_Int64* &gt; (&amp;x); 
        return *p ^ (*p &gt;&gt; 32); 
    }
</code></pre>
<p>wird</p>
<pre><code class="language-cpp">inline U_Int32 
    hash_d(double x) const
    { 
        U_Int64* p = reinterpret_cast&lt; U_Int64* &gt; (&amp;x); 
        U_Int64 pseudodouble=*p;
        return pseudodouble ^ (pseudodouble &gt;&gt; 32); 
    }
</code></pre>
<p>. so besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157984</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 19 Oct 2006 21:38:03 GMT</pubDate></item></channel></rss>