Kotlin:字符的哈希码与 ASCII 值相同

Kotlin: Hashcode of chars is same as ASCII value

我注意到 Char-values 的哈希码正是它们在 ASCII 中的 ID,例如:

println('a'.hashCode()) //is 97

这是合同规定的吗?我在哪里可以看到它的实现? class Any.kt 不包含实现,Char.kt 也不包含。

I noticed that the hashcode of Char-values is exactly the ID they have in ASCII […]

那是不可能的。 ASCII 只有 128 个值,但 Kotlin Char 有 65536,所以很明显,一个 Char 不能将它们的 ASCII 值作为它们的哈希码,因为其中 99.8% 的值 没有 一个 ASCII 值。

Is this true by contract

不,不是。 kotlin.Char.hashCode() 的合同是:

fun hashCode(): Int

Returns a hash code value for the object. The general contract of hashCode is:

  • Whenever it is invoked on the same object more than once, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.
  • If two objects are equal according to the equals() method, then calling the hashCode method on each of the two objects must produce the same integer result.

这就是整个合同。跟ASCII没什么关系。

and where can I see the implementation for this? The class Any.kt doesn't contain the implementation and Char.kt does neither.

我假设像 kotlin.Char or kotlin.Int 这样的类型实际上并没有实现为 Kotlin 对象,而是出于性能原因实现为编译器内部函数。例如,我希望 42 是 JVM 平台上的 JVM int 和 ECMAScript 平台上的 ECMAScript number,而不是作为带有对象头的完整对象实现,实例变量table、class指针等

碰巧的是,Kotlin 的 hashCode() 契约也与几乎所有其他语言的契约相匹配,所以我希望他们尽可能多地重用底层平台的实现。 (事实上​​,我怀疑这正是以这种方式设计合约的原因。)

即使对于 Kotlin/Native,将 kotlin.Int 映射到本地机器整数 int_fast32_tint32_t 类型也是有意义的。