<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>SHA-256 on Hellokitty&#39;s Blog</title>
    <link>https://yangyang233333.github.io/tags/sha-256/</link>
    <description>Recent content in SHA-256 on Hellokitty&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Tue, 11 Aug 2026 15:10:00 +0800</lastBuildDate>
    <atom:link href="https://yangyang233333.github.io/tags/sha-256/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>哈希碰撞概率与生日界：从公式到 SHA-256 / XXH128 实测</title>
      <link>https://yangyang233333.github.io/posts/hash-collision-birthday-bound/</link>
      <pubDate>Tue, 11 Aug 2026 15:10:00 +0800</pubDate>
      <guid>https://yangyang233333.github.io/posts/hash-collision-birthday-bound/</guid>
      <description>&lt;p&gt;选哈希算法时常有两个问题绑在一起：&lt;strong&gt;碰撞概率有多小&lt;/strong&gt;、&lt;strong&gt;算得有多快&lt;/strong&gt;。这篇把碰撞概率背后的数学（生日界）讲清楚，再用它算一算 256-bit 的 SHA-256/BLAKE3 与 128-bit 的 XXH128 各自的碰撞概率，最后附上一组本机实测速度数据。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文所有实测数据均来自随机生成的字节串，不含任何业务或私有数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一背景碰撞概率的两种含义&#34;&gt;一、背景：碰撞概率的两种含义&lt;/h2&gt;
&lt;p&gt;对固定长度输出的哈希，&amp;ldquo;碰撞概率&amp;quot;必须分两种场景谈，否则会得出互相矛盾的结论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;随机碰撞&lt;/strong&gt;：没有攻击者，数据是正常/随机的。这时只要输出在取值空间里均匀分布，碰撞概率就纯粹由&lt;strong&gt;输出位数&lt;/strong&gt;决定，与具体算法无关。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抗恶意碰撞&lt;/strong&gt;：有攻击者知道算法、故意构造两个哈希相同的输入。这里才真正区分&lt;strong&gt;加密哈希&lt;/strong&gt;（SHA-256、BLAKE3、BLAKE2）和&lt;strong&gt;非加密哈希&lt;/strong&gt;（xxHash、CityHash、Murmur）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一种是数学问题，用生日界就能算。第二种是密码学性质，非加密哈希直接不提供保证。&lt;/p&gt;
&lt;h2 id=&#34;二生日问题直觉的陷阱&#34;&gt;二、生日问题：直觉的陷阱&lt;/h2&gt;
&lt;p&gt;一个房间里要多少人，才有超过 50% 的概率存在两人同一天生日？答案是 &lt;strong&gt;23 人&lt;/strong&gt;——远比直觉小。原因在于碰撞看的不是&amp;quot;某人和我同天&amp;rdquo;，而是&amp;quot;任意两人之间&amp;quot;的配对数：&lt;code&gt;n&lt;/code&gt; 个人有 &lt;code&gt;n(n-1)/2 ≈ n²/2&lt;/code&gt; 对，概率随 &lt;code&gt;n²&lt;/code&gt; 增长。&lt;/p&gt;
&lt;p&gt;哈希碰撞是同一个问题：把&amp;quot;人&amp;quot;换成&amp;quot;哈希输入&amp;quot;，把&amp;quot;365 天&amp;quot;换成&amp;quot;哈希空间大小 &lt;code&gt;N&lt;/code&gt;&amp;quot;。对 128-bit 哈希，&lt;code&gt;N = 2^128&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;三生日界公式的推导&#34;&gt;三、生日界公式的推导&lt;/h2&gt;
&lt;p&gt;设哈希空间大小为 &lt;code&gt;N&lt;/code&gt;，独立均匀地放入 &lt;code&gt;n&lt;/code&gt; 个值。直接算&amp;quot;至少一次碰撞&amp;quot;要用容斥，很麻烦，所以反过来算&amp;quot;全部不同&amp;quot;的概率：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;第 1 个：随便放         → N/N
第 2 个：不能撞前 1 个  → (N-1)/N
...
第 n 个：不能撞前 n-1 个 → (N-n+1)/N
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;全部不同的概率是连乘：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;P(无碰撞) = ∏_{k=0}^{n-1} (1 - k/N)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;于是至少一次碰撞：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;P(碰撞) = 1 - ∏_{k=0}^{n-1} (1 - k/N)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是精确解，但连乘不好用。用近似 &lt;code&gt;1 - x ≈ e^(-x)&lt;/code&gt;（&lt;code&gt;x&lt;/code&gt; 很小时成立）把每一项换掉：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
