<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: thomasahle</title><link>https://news.ycombinator.com/user?id=thomasahle</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 21 Sep 2026 10:04:22 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=thomasahle" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[Claude Found Seed-indpendent collisions in most popular hash functions]]></title><description><![CDATA[
<p>Article URL: <a href="https://thomasahle.com/blog/adversarial-examples-for-hashes/">https://thomasahle.com/blog/adversarial-examples-for-hashes/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49775383">https://news.ycombinator.com/item?id=49775383</a></p>
<p>Points: 6</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 20 Sep 2026 12:55:12 +0000</pubDate><link>https://thomasahle.com/blog/adversarial-examples-for-hashes/</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49775383</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49775383</guid></item><item><title><![CDATA[New comment by thomasahle in "Android 17 is the first since 3.x to add new APIs without releasing to the AOSP"]]></title><description><![CDATA[
<p>Also Bada</p>
]]></description><pubDate>Fri, 18 Sep 2026 20:12:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=49759612</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49759612</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49759612</guid></item><item><title><![CDATA[New comment by thomasahle in "Bend 2 and the Vibe-Coding Trap"]]></title><description><![CDATA[
<p>> Where this differs from Bend is that what we have supplied here is everything required to prove the correctness of the program, without having a LLM waste time and tokens on building up a 442 line proof from first principles. We can run GNATprove and get: `Success: all checks proved (12 checks).`<p>GNATprove uses SMT solvers, meaning it's basically a brute force proof system.<p>Yes, brute-force proofs are easier than symbolic proofs (lean, bend, etc.) because you don't have to supply a proof. It's all automatic.<p>But brute-force proofs don't scale to nearly anything of interest, which is why formal verification has been a niche field for 30 years, until now where LLM can write _actual_ proofs.</p>
]]></description><pubDate>Fri, 18 Sep 2026 14:09:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=49754665</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49754665</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49754665</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>Sorry I meant<p><pre><code>    P_i = x_{2i} + (x_{2i+1} + z^3)(P_{i-1} + z^2)</code></pre></p>
]]></description><pubDate>Fri, 11 Sep 2026 11:12:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49656436</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49656436</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49656436</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>I'm happy to take a PR if you have a good layout in mind!</p>
]]></description><pubDate>Fri, 11 Sep 2026 06:25:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=49654243</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49654243</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49654243</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>> Hopefully that answers your question about why someone might still choose to use heuristic hashing<p>Not really. Our method is also 2x faster than xxh3.<p>Sure, AES make the heuristic hashes harder to break, but they still provide (1) slower performance, (2) no guarantees.</p>
]]></description><pubDate>Fri, 11 Sep 2026 06:24:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49654235</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49654235</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49654235</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>It's true that you can use AES instructions now on some computers, bit I honestly don't see why you'd use a heuristic hash (even if cryptographic) when you can get provable guarantees with k-wise independent hashing. Our paper makes these even faster than they already were.<p>See section 5.7 and 5.8 in the paper for experiments against other hashes.</p>
]]></description><pubDate>Thu, 10 Sep 2026 14:28:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=49644322</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49644322</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49644322</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>I'm not sure, since we only do univariate polynomials and k-path has lots of variables, right?<p>But maybe this work can inspire looking for other small, constant factor saving circuits for different classes of polynomials. Would be cool!</p>
]]></description><pubDate>Thu, 10 Sep 2026 10:49:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49641524</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49641524</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49641524</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>> the "universality" property of such hashes seldom provides any substantial benefit over alternative hash functions that do not have this property<p>Do you mean hashes like xxh3?
We have a section in the paper showing for a bunch of these that they collide much more often than universal hashes on bad inputs.</p>
]]></description><pubDate>Thu, 10 Sep 2026 09:53:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49641080</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49641080</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49641080</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>It's the blessing and the course of a polynomial inverse: the inverse is the same degree as the polynomial, so its largest coeffecient is large and blows up. 
Knuth-Eve and Pan use the root of a degree d polynomial, which is slightly less big, but still inpractical.</p>
]]></description><pubDate>Thu, 10 Sep 2026 09:29:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=49640887</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49640887</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49640887</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>> This method requires additional preprocessing of the coefficients, before starting to evaluate the polynomial. That preprocessing would slow the hashing algorithm more than what is gained during evaluation.<p>There is no preprocessing at hash time in either use.<p>Universal hashing: the message words are the parameters of the chain, a_i and b_i
in P_i = a_i + (b_i + y)(P_{i−1} + u), not coefficients of a target polynomial.
Distinct messages give distinct polynomials, which is all a universal hash needs;
the decoder never runs. Same as Bernstein's BRW.<p>k-independent hashing: the key should be a uniformly random monic polynomial of
degree k. Our parameterisation is a bijection onto those polynomials, with the
rational preprocessing as its inverse, so uniformly random gate constants give a
uniformly random polynomial. You draw the ⌊k/2⌋+1 constants and evaluate; the
coefficients are never computed. That is why the paper needs bijective rather than
just injective constructions, and the Section 5 speedups are for the whole hash.<p>Preprocessing only appears when a fixed polynomial (a Taylor approximation, a
secret-sharing polynomial) is evaluated at many points, and then it runs once.</p>
]]></description><pubDate>Thu, 10 Sep 2026 07:00:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639499</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639499</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639499</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>See also discussions here <a href="https://www.reddit.com/r/programming/comments/1wbgcke/comment/p8qhrhs/" rel="nofollow">https://www.reddit.com/r/programming/comments/1wbgcke/commen...</a> on how the actual math works out.</p>
]]></description><pubDate>Thu, 10 Sep 2026 06:32:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639268</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639268</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639268</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>Thank you! It was a lot of fun to make the website and see all the methods in practice after having just looked at the theory for a long time :D<p>> have a separate source node for each x, x^2, x^4 used<p>Do you mean a graph like this R&W? <a href="https://thomasahle.com/fast-polynomials/#ex=bessel&mode=Q&method=Rabin%E2%80%93Winograd&view=graph&form=original&cstyle=float&numfmt=exact&deg=9" rel="nofollow">https://thomasahle.com/fast-polynomials/#ex=bessel&mode=Q&me...</a>
there are nodes labeled x2, x4, x8; but it's the output of multiplications, and we want to make the number of mults visually clear.</p>
]]></description><pubDate>Thu, 10 Sep 2026 06:29:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639233</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639233</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639233</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>FFT multipoint evaluation is great when you know all the evaluation points in advance. However, for many practical applications the input is only streamed to you. E.g. a polynomial hash for a hashmap. Or preprocessing the taylor approximation of exp(x) for a standard library.</p>
]]></description><pubDate>Thu, 10 Sep 2026 06:25:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639202</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639202</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639202</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>In CRC8 you interpret the input as coefficients of a polynomial, and take mod `x⁸ + x² + x + 1`.
The problem we solve here is a bit different: You know the coefficients in advance, and want to preprocess the polynomial to make it fast to evaluate.<p>However, in section "5.9 Injective Polynomial Hashing" we actually study the problem of universal hashing, which is a lot more like CRC8.</p>
]]></description><pubDate>Thu, 10 Sep 2026 06:23:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639191</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639191</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639191</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>If you are working over floating point, you probably with to use Estrin's method (see <a href="https://en.wikipedia.org/wiki/Estrin%27s_scheme" rel="nofollow">https://en.wikipedia.org/wiki/Estrin%27s_scheme</a> - also tab 3 on the website.)<p>It takes advantage of FMA (fused multiply add), has good numeric stability and uses pipelining optimally.<p>A while ago I suggested using Estrin's method in Boost, for functions like std::exp. There's some interesting discussions here: <a href="https://github.com/boostorg/math/issues/924" rel="nofollow">https://github.com/boostorg/math/issues/924</a> if you are interested in all the practical details.<p>However, for finite fields (e.g. used for hashing and cryptography) multiplication is much more expensive than addition, which is the main use of this algorithm.</p>
]]></description><pubDate>Thu, 10 Sep 2026 06:11:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639101</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639101</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639101</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>I don't know what happened to the URL, but it's supposed to link to this paper: <a href="https://www.gwizfl.org/email/cr.yp.to/antiforgery/pema-20071022.pdf" rel="nofollow">https://www.gwizfl.org/email/cr.yp.to/antiforgery/pema-20071...</a><p>It's a very nice construction (based on Rabin & Winograd's polynomial multiplication method) for building universal hashes with n/2+O(logn) multiplications.<p>The annoying part is that it's a tree structure, which is not usually what you want in a fast hash that you're folding over a data stream. Some papers like <a href="https://eprint.iacr.org/2017/328.pdf" rel="nofollow">https://eprint.iacr.org/2017/328.pdf</a> try to fix this, but there are a lot of annoying trade-offs.<p>A famous fast hash is NH, which is just:<p><pre><code>   H(x) = sum_i (x_{2i} + a_{2i}) * (x_{2i+1} + a_{2i+1})
</code></pre>
where `a_i` are random keys. No modulus needed. The issue is that you need as many random keys as the length of the input.<p>Our construction (section 5.9 Injective Polynomial Hashing) shows that you can do something a bit similar with polynomials:<p><pre><code>    P_0 = z
    P_i = x_{2i} + (x_{2i+1} + z^3)(x_{2i} + z^2)
</code></pre>
this is a lot simpler than Bernstein's, and is still n/2 multiplications.</p>
]]></description><pubDate>Thu, 10 Sep 2026 06:06:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49639054</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49639054</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49639054</guid></item><item><title><![CDATA[New comment by thomasahle in "Show HN: Compute polynomials twice as fast"]]></title><description><![CDATA[
<p>WyHash and xxh3 are not polynomial, in fact this is one of the issues we try to solve in the paper.<p>Many "practical" hashes use heuristics instead of real field multiplications to be faster. But it means they are vulnerable to adversarial inputs. That means, it's possible to design a set of keys that have much higher probability (under random hash seeds/keys) to collide than you'd expect under a correct hash function.<p>We actually analyze both WyHash and xxh3 in this setting in section "Adversarial inputs for heuristic hashes" - <a href="https://arxiv.org/pdf/2609.06022#page=165" rel="nofollow">https://arxiv.org/pdf/2609.06022#page=165</a></p>
]]></description><pubDate>Thu, 10 Sep 2026 05:59:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=49638999</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49638999</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49638999</guid></item><item><title><![CDATA[New comment by thomasahle in "Apple Watch Ultra 4"]]></title><description><![CDATA[
<p>It's surprising that in 2026 they still haven't figured out how to remove the bezels. They are smaller than they used to be, but
On something as compact a watch, all screen estate counts.</p>
]]></description><pubDate>Wed, 09 Sep 2026 20:05:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=49633382</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49633382</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49633382</guid></item><item><title><![CDATA[New comment by thomasahle in "What do Visa and Mastercard do? An intro to card networks"]]></title><description><![CDATA[
<p>They charge you 23%?<p>I thought in the EU the maximum interchange fee for consumer credit cards is capped at 0.3% of the transaction value.</p>
]]></description><pubDate>Wed, 09 Sep 2026 19:58:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=49633281</link><dc:creator>thomasahle</dc:creator><comments>https://news.ycombinator.com/item?id=49633281</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49633281</guid></item></channel></rss>