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

标签 java swift string

我正在创建现有 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/

相关文章:

java - 如何在Java中将g729编码的字节数组转换为.wav pcm_alaw?

java - 启动一个在父进程中存活的子进程

java - 如何使用java将值插入sql server?

java - 如何阻止 HTTP 并允许 HTTPS?

swift - 核心 WLAN MCS 索引?

swift - 字符 0 周围的值无效

SwiftUI 按钮选择

c - 在 C 格式字符串中,退格键\b 在\n 之前不起作用

python - 评估Python中字串的辅音/元音组成

python - 在 Python 中获取标点符号的字符串常量