<?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[compile time hash (Adler-32)]]></title><description><![CDATA[<p>EDIT: falschrum durch den string zu gehen, war nicht so schlau.<br />
Jetzt fehlt mir noch etwas, mit dem ich das parameter pack umdrehen kann.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;boost/preprocessor/repetition/repeat.hpp&gt;
#define GET_STR_AUX(_, i, str) (sizeof(str) &gt; (i) ? str[(i)] : 0),
// BOOST_PP_REPEAT verwendet hier 3 wegen des Beispiels
// So kann ich den hash nachprüfen, sonst würden noch weitere nullen reingeschoben
#define GET_STR(str) BOOST_PP_REPEAT(3,GET_STR_AUX,str) 0
#define MOD_ADLER 65521

template &lt;char C, char... List&gt; struct const_hash
{
    const static uint32_t s1 = (const_hash&lt;List...&gt;::s1 + C) % MOD_ADLER;
    const static uint32_t s2 = (const_hash&lt;List...&gt;::s2 + s1) % MOD_ADLER;
    const static uint32_t value = (s2 &lt;&lt; 16) | s1;
};

template &lt;char C&gt; struct const_hash &lt;C&gt; // C = '\0'
{
    const static uint32_t s1 = 1;
    const static uint32_t s2 = 0;
    const static uint32_t value = (s2 &lt;&lt; 16) | s1;
};

#define HASH(STRING) const_hash&lt;GET_STR(STRING)&gt;::value

int main()
{
    std::cout &lt;&lt; std::hex &lt;&lt; HASH(&quot;CBA&quot;); // CBA für ABC, jetzt muss ich noch was zum umdrehen basteln
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/324534/compile-time-hash-adler-32</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 08:40:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324534.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Mar 2014 22:45:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to compile time hash (Adler-32) on Thu, 20 Mar 2014 23:35:45 GMT]]></title><description><![CDATA[<p>EDIT: falschrum durch den string zu gehen, war nicht so schlau.<br />
Jetzt fehlt mir noch etwas, mit dem ich das parameter pack umdrehen kann.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;boost/preprocessor/repetition/repeat.hpp&gt;
#define GET_STR_AUX(_, i, str) (sizeof(str) &gt; (i) ? str[(i)] : 0),
// BOOST_PP_REPEAT verwendet hier 3 wegen des Beispiels
// So kann ich den hash nachprüfen, sonst würden noch weitere nullen reingeschoben
#define GET_STR(str) BOOST_PP_REPEAT(3,GET_STR_AUX,str) 0
#define MOD_ADLER 65521

template &lt;char C, char... List&gt; struct const_hash
{
    const static uint32_t s1 = (const_hash&lt;List...&gt;::s1 + C) % MOD_ADLER;
    const static uint32_t s2 = (const_hash&lt;List...&gt;::s2 + s1) % MOD_ADLER;
    const static uint32_t value = (s2 &lt;&lt; 16) | s1;
};

template &lt;char C&gt; struct const_hash &lt;C&gt; // C = '\0'
{
    const static uint32_t s1 = 1;
    const static uint32_t s2 = 0;
    const static uint32_t value = (s2 &lt;&lt; 16) | s1;
};

#define HASH(STRING) const_hash&lt;GET_STR(STRING)&gt;::value

int main()
{
    std::cout &lt;&lt; std::hex &lt;&lt; HASH(&quot;CBA&quot;); // CBA für ABC, jetzt muss ich noch was zum umdrehen basteln
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2390077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390077</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 20 Mar 2014 23:35:45 GMT</pubDate></item><item><title><![CDATA[Reply to compile time hash (Adler-32) on Thu, 20 Mar 2014 23:35:29 GMT]]></title><description><![CDATA[<p>Du brauchst hier kein Boost.PP! Das ist ein Zweizeiler, den du selber schreibst!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390082</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 20 Mar 2014 23:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to compile time hash (Adler-32) on Thu, 20 Mar 2014 23:49:38 GMT]]></title><description><![CDATA[<p>Ich habe versehentlich rauseditiert, dass ich kein constexpr habe</p>
<p>Sonst wäre das Kindergarten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390083</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Thu, 20 Mar 2014 23:49:38 GMT</pubDate></item><item><title><![CDATA[Reply to compile time hash (Adler-32) on Thu, 20 Mar 2014 23:51:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich habe versehentlich rauseditiert, dass ich kein constexpr habe</p>
</blockquote>
<p>Das brauchst du dafür auch nicht. Das sind zwei Makros in diesem Beispiel, sonst ein paar mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390084</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 20 Mar 2014 23:51:27 GMT</pubDate></item><item><title><![CDATA[Reply to compile time hash (Adler-32) on Fri, 21 Mar 2014 01:31:23 GMT]]></title><description><![CDATA[<p>Zunächst erstmal zu meinem eigentlichen Problem:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;boost/preprocessor/repetition/repeat.hpp&gt;
#define GET_STR_AUX(_, i, str) (sizeof(str) &gt; (i)+1 ? str[sizeof(str)-(i)-2] : 0),
#define GET_STR(str) BOOST_PP_REPEAT(64,GET_STR_AUX,str) 0
#define MOD_ADLER 65521

template &lt;char C, char... List&gt; struct const_hash
{
    const static uint32_t s1 = (C!=0)?((const_hash&lt;List...&gt;::s1 + C) % MOD_ADLER):(1);
    const static uint32_t s2 = (C!=0)?((const_hash&lt;List...&gt;::s2 + s1) % MOD_ADLER):(0);
    const static uint32_t value = (s2 &lt;&lt; 16) | s1;
};

template &lt;char C&gt; struct const_hash &lt;C&gt;
{
    const static uint32_t s1 = 1;
    const static uint32_t s2 = 0;
    const static uint32_t value = (s2 &lt;&lt; 16) | s1;
};

#define HASH(STRING) const_hash&lt;GET_STR(STRING)&gt;::value

int main()
{
    std::cout &lt;&lt; std::hex &lt;&lt; HASH(&quot;ABCDEF&quot;) &lt;&lt; &quot;\n&quot;;
    return 0;
}
</code></pre>
<p>Dies reversed die Anordnung automatisch und ignoriert folgende Nullen.</p>
<p>Das mit dem Makro überlege ich mir. Ich finde den Präprozessor ein wenig... anstrengend</p>
<p>EDIT: ich plane nicht strings zu hashen, die ein '\0' in der Mitte haben.</p>
<p>EDIT 2: Hat sich sowieso erledigt. Ein kleiner Test hat ergeben, dass</p>
<pre><code>__const_adler32&lt;&quot;str&quot;[sizeof(&quot;str&quot;)-(0)-2]&gt;::value;
</code></pre>
<p>für Visual Studio 2013 nicht gültig ist, da &quot;str&quot;[sizeof(&quot;str&quot;)-(0)-2]<br />
keine compile-time constant expression ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390088</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 21 Mar 2014 01:31:23 GMT</pubDate></item><item><title><![CDATA[Reply to compile time hash (Adler-32) on Fri, 21 Mar 2014 08:19:54 GMT]]></title><description><![CDATA[<blockquote>
<p>keine compile-time constant expression ist</p>
</blockquote>
<p>Ist natürlich falsch.</p>
<p>Der Möglichkeit nach hast du noch eine andere Option, die ist aber relativ ungünstig: Global ein char-Array deklarieren, und dann einen Zeiger darauf an das Template übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390129</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 21 Mar 2014 08:19:54 GMT</pubDate></item></channel></rss>