在scala中,为什么Range.hashCode()速度如此之慢,而且无法使其更快?

在scala中,为什么Range.hashCode()速度如此之慢,而且无法使其更快?,scala,range,hashcode,Scala,Range,Hashcode,考虑到以下准则: def timed[T](fn: => T): (T, Long) = { val startTime = System.currentTimeMillis() val result = fn val endTime = System.currentTimeMillis() (result, endTime - startTime) } val t1 = timed((0 until Int.MaxValue).hashCode(

考虑到以下准则:

  def timed[T](fn: => T): (T, Long) = {
    val startTime = System.currentTimeMillis()
    val result = fn
    val endTime = System.currentTimeMillis()
    (result, endTime - startTime)
  }

val t1 = timed((0 until Int.MaxValue).hashCode())
val t2 = timed((0, Int.MaxValue).hashCode())

print(t1 + " : " + t2)
理论上,一个范围的hashCode()的速度可以与一个元组相比较,相反,速度的差异是惊人的:

(201341306,5274) : (-281813831,0)

事实证明,该范围继承了IndexSeq的hashCode()实现,这需要一个完整的迭代。我的问题是,有没有可能加快速度?是什么阻止了它的实现?

在scala标准库中,如果所有顺序集合的内容相等,则认为它们相等

Vector(1,2,3) == List(1,2,3) //true

由于
equals
/
hashcode
合同,对于每种类型的集合,hashcode必须以相同的方式进行计算。

在scala标准库中,如果所有顺序集合的内容相等,则认为它们是相等的

Vector(1,2,3) == List(1,2,3) //true

而且由于
等于
/
hashcode
合约hashcode必须对每种类型的集合以相同的方式进行计算。

IMHO,范围的
hashcode
相当于集合的。无论如何,关于如何使其更快,您可以编写一个扩展方法,将
hashCode
计算为元组之一<代码>隐式类RangeOps(val r:Range)扩展AnyVal{def tupledHashCode:Int=(r.start,r.end).hashCode}IMHO,范围的
hashCode
相当于集合的
。无论如何,关于如何使其更快,您可以编写一个扩展方法,将
hashCode
计算为元组之一<代码>隐式类RangeOps(val r:Range)扩展了AnyVal{def tupledHashCode:Int=(r.start,r.end).hashCode}
我知道,但是应该有一个快速散列的快捷方式对于这种特殊情况优化
杂音散列的计算?看起来是一道相当难的数学题。@tribbloid你能解释一下为什么你认为应该有一条快速的捷径吗?请记住,对于任何包含可能由
范围
生成的任何序列的集合,这必须给出与
范围
相同的结果。现在我只能假设一种满足这种简化的新型哈希函数,它肯定不是杂音哈希,但我还没有弄清楚它是什么:)我知道,但是应该有一个快速散列的捷径优化这个特殊情况下的
杂音散列的计算?看起来是一道相当难的数学题。@tribbloid你能解释一下为什么你认为应该有一条快速的捷径吗?请记住,对于任何包含可能由
范围
生成的任何序列的集合,这必须给出与
范围
相同的结果。现在我只能假设一种满足这种简化的新型哈希函数,它肯定不是杂音哈希,但我还没有弄清楚它是什么:)