You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.5 KiB
74 lines
1.5 KiB
1 year ago
|
/**
|
||
|
* File: simple_hash.swift
|
||
|
* Created Time: 2023-07-01
|
||
|
* Author: nuomi1 (nuomi1@qq.com)
|
||
|
*/
|
||
|
|
||
|
/* 加法哈希 */
|
||
|
func addHash(key: String) -> Int {
|
||
|
var hash = 0
|
||
|
let MODULUS = 1_000_000_007
|
||
|
for c in key {
|
||
|
for scalar in c.unicodeScalars {
|
||
|
hash = (hash + Int(scalar.value)) % MODULUS
|
||
|
}
|
||
|
}
|
||
|
return hash
|
||
|
}
|
||
|
|
||
|
/* 乘法哈希 */
|
||
|
func mulHash(key: String) -> Int {
|
||
|
var hash = 0
|
||
|
let MODULUS = 1_000_000_007
|
||
|
for c in key {
|
||
|
for scalar in c.unicodeScalars {
|
||
|
hash = (31 * hash + Int(scalar.value)) % MODULUS
|
||
|
}
|
||
|
}
|
||
|
return hash
|
||
|
}
|
||
|
|
||
|
/* 异或哈希 */
|
||
|
func xorHash(key: String) -> Int {
|
||
|
var hash = 0
|
||
|
let MODULUS = 1_000_000_007
|
||
|
for c in key {
|
||
|
for scalar in c.unicodeScalars {
|
||
|
hash ^= Int(scalar.value)
|
||
|
}
|
||
|
}
|
||
|
return hash & MODULUS
|
||
|
}
|
||
|
|
||
|
/* 旋转哈希 */
|
||
|
func rotHash(key: String) -> Int {
|
||
|
var hash = 0
|
||
|
let MODULUS = 1_000_000_007
|
||
|
for c in key {
|
||
|
for scalar in c.unicodeScalars {
|
||
|
hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS
|
||
|
}
|
||
|
}
|
||
|
return hash
|
||
|
}
|
||
|
|
||
|
@main
|
||
|
enum SimpleHash {
|
||
|
/* Driver Code */
|
||
|
static func main() {
|
||
|
let key = "Hello 算法"
|
||
|
|
||
|
var hash = addHash(key: key)
|
||
|
print("加法哈希值为 \(hash)")
|
||
|
|
||
|
hash = mulHash(key: key)
|
||
|
print("乘法哈希值为 \(hash)")
|
||
|
|
||
|
hash = xorHash(key: key)
|
||
|
print("异或哈希值为 \(hash)")
|
||
|
|
||
|
hash = rotHash(key: key)
|
||
|
print("旋转哈希值为 \(hash)")
|
||
|
}
|
||
|
}
|