我正在为一款现有的Android应用程序创建iOS版本。在Android端,一个字符串(用户名)的hashCode()被发送到服务器,基于该哈希值返回一个JSON对象。
在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;
但是,当我用Swift编写上述实现时,会出现溢出崩溃。有人能帮我吗?
提前感谢。
这是Swift的实现:
我首先必须编写一个Character扩展,该扩展将返回字符的Ascii值:
extension Character {
var asciiValue: UInt32? {
return String(self).unicodeScalars.filter{$0.isASCII}.first?.value
}
}
那我创建了一个String扩展,其中包括: 1. 一个属性,返回字符串中每个字符的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!
}
}
&+
,&*
等,正是为了这个目的而设立的。 - saagarjhaHashable
的示例。 - antonio081014Int
很可能是 64 位,而 Java 定义int
为 32 位。尝试使用Int32
。 - saagarjha