已实施Swift 4.2
SE-0206
随机播种
哈希函数。这就是哈希结果每次都不同的原因(因为种子是随机的)。你可以找到Hasher结构的实现,生成一个随机种子,
here
.
如果您想要一个与字符串、accross设备和app lauches关联的稳定散列值,可以使用这个
solution
Warren Stringer
:
let str = "Hello"
func strHash(_ str: String) -> UInt64 {
var result = UInt64 (5381)
let buf = [UInt8](str.utf8)
for b in buf {
result = 127 * (result & 0x00ffffffffffffff) + UInt64(b)
}
return result
}
strHash(str) //177798404835661
或者有
these
在字符串上定义了几个扩展名:
extension String {
var djb2hash: Int {
let unicodeScalars = self.unicodeScalars.map { $0.value }
return unicodeScalars.reduce(5381) {
($0 << 5) &+ $0 &+ Int($1)
}
}
var sdbmhash: Int {
let unicodeScalars = self.unicodeScalars.map { $0.value }
return unicodeScalars.reduce(0) {
(Int($1) &+ ($0 << 6) &+ ($0 << 16)).addingReportingOverflow(-$0).partialValue
}
}
}
"Hello".djb2hash //210676686969
"Hello".sdbmhash //5142962386210502930
(在代码10,Swift 4.2上执行)