Đây là một băm phi crypto, cho Swift 3:
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
}
Nó được bắt nguồn hơi từ C++ 11 constexpr
constexpr uint64_t str2int(char const *input) {
return *input // test for null terminator
? (static_cast<uint64_t>(*input) + // add char to end
127 * ((str2int(input + 1) // prime 127 shifts left almost 7 bits
& 0x00ffffffffffffff))) // mask right 56 bits
: 5381; // start with prime number 5381
}
Thật không may, hai không mang lại cùng một băm. Để làm điều đó bạn cần phải đảo ngược thứ tự iterator trong strHash:
for b in buf.reversed() {...}
Nhưng điều đó sẽ chạy chậm hơn 13x, phần nào so sánh được với phần mở rộng djb2hash Chuỗi mà tôi nhận được từ https://useyourloaf.com/blog/swift-hashable/
Dưới đây là một số tiêu chuẩn, cho một triệu lần lặp:
hashValue execution time: 0.147760987281799
strHash execution time: 1.45974600315094
strHashReversed time: 18.7755110263824
djb2hash execution time: 16.0091370344162
sdbmhash crashed
đối với C++, các str2Int là khoảng càng nhanh càng Swift 3 của hashValue:
str2int execution time: 0.136421
Nguồn
2017-03-31 20:53:44
nếu nó có thể đơn giản, tại sao không sử dụng [MD5 hash] (http://stackoverflow.com/a/2018626/1219956) chỉnh sửa: [swift version] (http://stackoverflow.com/questions/24123518/ how-to-use-cc-md5-method-in-swift-language) – Fonix
@ Fonix Vâng, đó có thể là giải pháp. Có rất nhiều câu trả lời cho câu hỏi mà bạn đang liên kết - bạn có thể giới thiệu bất kỳ câu hỏi nào có triển khai băm MD5 ổn định và nhanh chóng trong Swift không? – drasto
xem liên kết thứ hai trong nhận xét đầu tiên của tôi, nhưng nếu không có nhiều giải pháp với một google nhanh chóng – Fonix