<?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[Hashvalue für doubles mittels reinterpret_cast: Deref Type-Pun-Zeigers verursacht seg-faults, wie vermeiden?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Funktion die aus einem double-vektor einen &quot;eindeutigen&quot; Schlüssel generieren soll. Dazu werden einfach pro double-Wert ein Hash-Value berechnet und zum alten schlüssel mit einem-mix-value und einer Primzahl hinzuaddiert.</p>
<p>Unter meinem alten comiler der version gcc 3.4 (oder sowas) ging alles einwandfrei. Jetzt unter meinem neuen gcc 4.1.3 compiler nicht mehr. Es gibt<br />
Warnungen vom Compiler beim Compilieren (was vorher nicht der Fall war) und zwar:</p>
<pre><code>Warnung: Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln
</code></pre>
<p>Nun zur Arbeitsweise von Hash_Double:<br />
Ich habe einen 64 Bit Wert und will einen 32 Bit wert daraus generieren der möglichst &quot;unikat&quot; wird. Dazu mache ich ein Xor der unteren und oberen 32 Bit<br />
der 64 Bit Zahl und gebe Sie zurück.</p>
<p>Im Moment überlege ich wie ich evtl. den reinterpret_cast umgehen kann bzw. wie ich diese Hash-Value Berechnung allgemein ändern könnte. Für Ideen bzw. auch Ratschläge was den cast oder gar einen komplett anderen Weg angeht wäre ich sehr dankbar.</p>
<p>Evtl. sollte ich auf 64 Bit Schlüsseln arbeiten und da versuchen einen neuen Weg einzuschlagen?</p>
<pre><code class="language-cpp">typedef unsigned long long U_Int64; 
typedef unsigned int U_Int32;

template &lt;&gt;	U_Int32 
Cache&lt;double&gt;::Compute_Key(	const double* vec, 
							size_t size) const
{                    
	U_Int32 ret = 0;
	U_Int32 mix = Hash_Double(0.13);
	while(size--)
	{
		ret = (ret * 31) + mix + Hash_Double(*vec);
		vec++;
	} 
	return ret;
}
</code></pre>
<pre><code class="language-cpp">template &lt;class T&gt;	inline U_Int32 
Cache&lt;T&gt;::Hash_Double(double x)
{ 
	U_Int64* p = reinterpret_cast&lt; U_Int64* &gt; (&amp;x); 
	return *p ^ (*p &gt;&gt; 32); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/194433/hashvalue-für-doubles-mittels-reinterpret_cast-deref-type-pun-zeigers-verursacht-seg-faults-wie-vermeiden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 15:45:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194433.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Oct 2007 20:19:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hashvalue für doubles mittels reinterpret_cast: Deref Type-Pun-Zeigers verursacht seg-faults, wie vermeiden? on Sat, 06 Oct 2007 20:19:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Funktion die aus einem double-vektor einen &quot;eindeutigen&quot; Schlüssel generieren soll. Dazu werden einfach pro double-Wert ein Hash-Value berechnet und zum alten schlüssel mit einem-mix-value und einer Primzahl hinzuaddiert.</p>
<p>Unter meinem alten comiler der version gcc 3.4 (oder sowas) ging alles einwandfrei. Jetzt unter meinem neuen gcc 4.1.3 compiler nicht mehr. Es gibt<br />
Warnungen vom Compiler beim Compilieren (was vorher nicht der Fall war) und zwar:</p>
<pre><code>Warnung: Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln
</code></pre>
<p>Nun zur Arbeitsweise von Hash_Double:<br />
Ich habe einen 64 Bit Wert und will einen 32 Bit wert daraus generieren der möglichst &quot;unikat&quot; wird. Dazu mache ich ein Xor der unteren und oberen 32 Bit<br />
der 64 Bit Zahl und gebe Sie zurück.</p>
<p>Im Moment überlege ich wie ich evtl. den reinterpret_cast umgehen kann bzw. wie ich diese Hash-Value Berechnung allgemein ändern könnte. Für Ideen bzw. auch Ratschläge was den cast oder gar einen komplett anderen Weg angeht wäre ich sehr dankbar.</p>
<p>Evtl. sollte ich auf 64 Bit Schlüsseln arbeiten und da versuchen einen neuen Weg einzuschlagen?</p>
<pre><code class="language-cpp">typedef unsigned long long U_Int64; 
typedef unsigned int U_Int32;

template &lt;&gt;	U_Int32 
Cache&lt;double&gt;::Compute_Key(	const double* vec, 
							size_t size) const
{                    
	U_Int32 ret = 0;
	U_Int32 mix = Hash_Double(0.13);
	while(size--)
	{
		ret = (ret * 31) + mix + Hash_Double(*vec);
		vec++;
	} 
	return ret;
}
</code></pre>
<pre><code class="language-cpp">template &lt;class T&gt;	inline U_Int32 
Cache&lt;T&gt;::Hash_Double(double x)
{ 
	U_Int64* p = reinterpret_cast&lt; U_Int64* &gt; (&amp;x); 
	return *p ^ (*p &gt;&gt; 32); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1379401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379401</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sat, 06 Oct 2007 20:19:06 GMT</pubDate></item><item><title><![CDATA[Reply to Hashvalue für doubles mittels reinterpret_cast: Deref Type-Pun-Zeigers verursacht seg-faults, wie vermeiden? on Sat, 06 Oct 2007 20:49:25 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class T&gt;    inline U_Int32
Cache&lt;T&gt;::Hash_Double(const double&amp; x)
{
    U_Int32 p[2];
    memcpy( p, &amp;x, sizeof p );
    return p[0] ^ p[1];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1379417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379417</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 06 Oct 2007 20:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to Hashvalue für doubles mittels reinterpret_cast: Deref Type-Pun-Zeigers verursacht seg-faults, wie vermeiden? on Sun, 07 Oct 2007 12:09:27 GMT]]></title><description><![CDATA[<p>Danke, so gehts einwandfrei wieder!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1379641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1379641</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Sun, 07 Oct 2007 12:09:27 GMT</pubDate></item></channel></rss>