代码之家  ›  专栏  ›  技术社区  ›  Dario

快速排序是否存在潜在的安全风险?

  •  18
  • Dario  · 技术社区  · 16 年前

    我只是想知道(在某些严重的偏执和特定情况下)是否使用 快速分类 算法可以被视为应用程序中的安全风险。

    它的基本实现和改进版本(如3-median-quicksort)都具有对某些输入数据表现异常的特性,这意味着在这些情况下,它们的运行时间可能会极大地增加(具有 O(n^2) 复杂性)更不用说堆栈溢出的可能性。

    因此,我认为向程序提供预先排序的数据可能会造成危害,导致算法的行为类似于此,这可能会对多客户端web应用程序造成不可预测的后果。

    这个奇怪的案例是否值得任何安全考虑(并因此迫使我们使用 介绍- 相反地?

    编辑:

    6 回复  |  直到 10 年前
        1
  •  26
  •   Pavel Minaev    16 年前

    是的,这是一个安全风险——具体来说是DoS——通过在快速排序中添加递归深度检查,并在达到某个深度时切换到其他内容,可以很容易地减轻这种风险。如果你换成heapsort,你会得到 introsort ,这是许多STL实现实际使用的。

    或者,您只需随机化轴元素的选择。

        2
  •  9
  •   Ben S    16 年前

    许多快速排序的实现都是使用 randomized version of the algorithm DoS attack 使用精心编制的输入是不可能的。

    总的来说,任何使用快速排序的web应用程序都更有可能有其他应用程序 security flaws .

        3
  •  5
  •   Community Mohan Dere    9 年前

    看一下这个问题(和有标记的答案),它讨论了减少QuickSort最坏情况的方法:

    Why is quicksort better than mergesort?

        4
  •  1
  •   Adam Robinson    16 年前

    如果性能很重要,那么在大多数情况下,无论是否出于安全考虑,快速排序似乎都是一个糟糕的选择。有没有什么东西会让你回避像Heapsort或Mergesort这样的算法?

        5
  •  1
  •   Eran    16 年前

    我认为这在很大程度上是一个问题,你实际上在哪里使用快速排序。例如,在处理5个项目的数组时,使用O(n^2)算法是非常好的。另一方面,当数据可能非常大时,担心DoS并不是你要面对的第一个问题——第一个问题是在你面对真正的问题之前性能会变得很差。考虑到大量其他可用的算法,如果它位于关键位置,请更换它。

        6
  •  1
  •   rtperson    16 年前

    是的,但只有在非常、非常不可能的情况下——所有这些都是一个适当设计的算法很容易避免的。

    但是如果你想超级安全,你可能想使用 Introsort ,它以快速排序开始,但如果从递归深度检测到算法开始变为二次排序,则会切换到堆排序。

    我看到帕维尔打败了我。

    针对编辑后的问题: