Есть ли способ узнать, как Swift вычисляет hashValue? - PullRequest
0 голосов
/ 08 сентября 2018

Недавно я обнаружил, что приведенный ниже код заканчивается коллизией хешей.

К вашему сведению, я использую XCode 9.4.1 (9F2000), который использует Swift 4.1.2

import Foundation

let lhs = "あいうえおあいう21あいうえ"
let rhs = "あいうえおあいう22あいうえ"
let percentEncodedLhs = lhs.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!
let percentEncodedRhs = rhs.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!

let lhsHashValue = lhs.hashValue
let rhsHashValue = rhs.hashValue
let lhsPercentHashValue = percentEncodedLhs.hashValue
let rhsPercentHashValue = percentEncodedRhs.hashValue

print(lhsHashValue == rhsHashValue)
print(lhsPercentHashValue == rhsPercentHashValue)

/*
 Output:

 false
 true
 */

Я знаю, что в некоторых случаях может произойти коллизия хешей, но я не смог найти , как Swift вычисляет hashValue для String .

Например, Java вычисляет hashCode из String следующим образом: https://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()

Есть ли официальное объяснение или, возможно, некоторые предположения?

1 Ответ

0 голосов
/ 08 сентября 2018

но я не смог найти, как Swift вычисляет hashValue для String

Почему ты не мог? Swift с открытым исходным кодом. Если вы заинтересованы, прочитайте источник.

https://github.com/apple/swift/blob/111499d2bfc58dc12fcb9cd1ce1dda7978c995b7/stdlib/public/core/StringHashable.swift

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...