我正在創建現有Android應用的iOS版本。 在Android端,String(username)的hashCode()被髮送到服務器,並基於該hash,返回一個JSON對象。在Swift 3中實現Java String的hashCode()方法
在Swift上,我嘗試了hash和hashValue屬性,但它們都產生了與Android對應的值不同的值。
所以我決定基於Java的實現,以寫我自己的實現:
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
但是,當我寫斯威夫特上面的實現,我得到溢出崩潰。有人可以幫我嗎?
在此先感謝。
這裏是迅速實施:
我第一次寫一個字的擴展,將返回字符的ASCII值:
extension Character {
var asciiValue: UInt32? {
return String(self).unicodeScalars.filter{$0.isASCII}.first?.value
}
}
然後創建一個字符串與擴展: 1.屬性,該屬性返回String中每個字符的Ascii值。 2.散列方法返回哈希(複製Java代碼)
extension String {
var asciiArray: [UInt32] {
return unicodeScalars.filter{$0.isASCII}.map{$0.value}
}
func myHash() -> Int {
var h = 0 as Int!
for i in 0..<asciiArray.count {
h = 31*h! + Int(array[i])
}
return h!
}
}
而這正是您不應該使用散列值來識別多平臺系統上的對象的原因。爲什麼不直接使用用戶名或其他主鍵? – Alexander
Swift溢出運算符'&+','&*'等完全是爲了這個目的。 –
我正在編輯我的帖子以包含Swift實現 –