【发布时间】:2012-02-10 05:48:52
【问题描述】:
有许多系统依赖于某些特定值的唯一性。想到任何使用 GUID 的东西(例如 Windows 注册表或其他数据库),还有从对象创建哈希以识别它并因此需要此哈希唯一的东西。
散列表通常不介意两个对象是否具有相同的散列,因为散列仅用于将对象分解为类别,因此在查找时,不是表中的所有对象,而是表中的那些对象必须将同一类别(存储桶)与搜索对象进行身份比较。
但是(似乎)其他实现取决于唯一性。我的例子(这就是我提出这个问题的原因)是 Mercurial 的修订 ID。 Mercurial 邮件列表中的entry 正确声明
变更集哈希的几率 第一次意外相撞 十亿次提交基本上为零。但 我们会注意到它是否发生。和 你会因为那个人而出名 意外破坏了 SHA1。
但即使是最小的概率也不意味着不可能。现在,我不想解释为什么完全可以依赖唯一性(例如,已经讨论过here)。这一点我很清楚。
相反,我想知道(也许通过你自己工作中的例子):
是否有任何最佳实践来涵盖这些不太可能的情况?
是否应该忽略它们,因为特别强烈的太阳风更有可能导致硬盘读取错误?
是否应该至少对其进行测试,如果只是失败并向用户显示“我放弃,你已经完成了不可能”的消息?
或者即使这些情况也应该得到妥善处理?
对我来说,尤其是以下内容很有趣,尽管它们有些敏感:
如果你不处理这些情况,你会如何对抗不听概率的直觉?
如果你确实处理了它们,你如何证明这项工作的合理性(对你自己和他人),考虑到有更多可能的情况你不处理,比如超新星?
【问题讨论】:
-
如果开发人员包含了一些测试代码,最近的OpenSSL vulnerability 可能会更早被检测到。显然,它不应该尝试遍历所有可能的来源,但是如果它在没有警告的情况下运行一百万次迭代,您会很好地了解可能性。知识胜于信仰。
-
例如,这里是一个示例,其中 MSFT support.microsoft.com/kb/304017">checking 用于 GUID 空间中的冲突 导致 SQL Server 中的错误必须在 Windows 2000 中进行修补.
-
还有一个非零的概率你通过你的椅子做量子隧道并跌倒在地板上,但在下面放一个枕头是矫枉过正的。这在很大程度上取决于你在做什么。如果您正在开发隧道显微镜,那么您想要处理的是意想不到的和不可能的事情(特别是因为在那个规模上它变得不可忽视)。从技术上讲,内存不足的情况比 SHA 冲突更有可能,但我从未见过认真处理 OOM 的代码。