gpt4 book ai didi

java - 在 Swift 3 中实现 Java String 的 hashCode() 方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:43 24 4
gpt4 key购买 nike

我正在创建现有 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 的实现:

我首先必须编写一个字符扩展来返回字符的 Ascii 值:

extension Character {
var asciiValue: UInt32? {
return String(self).unicodeScalars.filter{$0.isASCII}.first?.value
}
}

然后我创建了一个字符串扩展:1. 返回字符串中每个字符的 Ascii 值的属性。2.一个hash方法返回hash(复制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!
}
}

最佳答案

由于帖子仍然缺少答案,这里是工作代码:

1) 为字符编写一个扩展,将它们的 ascii 表示映射到一个 int - 我们需要 UInt32,因为 Java 使用 32 位系统而不是 64 位系统进行哈希处理。

2) 确保我们表示的字符串只包含可映射到 ASCII 的字符

3) 现在执行提到的散列函数

int h = 0;
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;

因此,我们将得到以下代码片段,可以在您的项目中使用。

// 1) Here is our Character extension
extension Character {
var asciiValue: UInt32? {
return String(self).unicodeScalars.filter{$0.isASCII}.first?.value
}
}

extension String {
// 2) ascii array to map our string
var asciiArray: [UInt32] {
return unicodeScalars.filter{$0.isASCII}.map{$0.value}
}

// this is our hashCode function, which produces equal output to the Java or Android hash function
func hashCode() -> Int32 {
var h : Int32 = 0
for i in self.asciiArray {
h = 31 &* h &+ Int32(i) // Be aware of overflow operators,
}
return h
}
}

关于java - 在 Swift 3 中实现 Java String 的 hashCode() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com