计算IOS中的哈希率

时间:2019-02-23 18:33:59

标签: ios swift cryptography

我正在尝试计算IOS设备的哈希率。根据{{​​3}}和Wiki,如果我让H(M)为消息M的SHA-256哈希,那么SHA-256D就是H(H(M))。为了计算速率(此处为比特币专用),我将经过处理的哈希数除以经过的秒数,如Quora所述。

这是我在Swift中使用here的实现:

我首先生成10000个随机字符串以进行哈希处理:

func generateRandomStrings() -> [String] {
    var randomStrings = [String]();
    for _ in 0..<10000 {
        randomStrings.append(NSUUID().uuidString);
    }
    return randomStrings;
}

然后我取每个的sha256d:

import CryptoSwift

@IBAction func performHash(_ sender: Any) {

    var generatedStrings = generateRandomStrings();
    let info = ProcessInfo.processInfo;
    let begin = info.systemUptime;
    for i in 0..<generatedStrings.count {
        // calcualte the SHA256d
        _ = (generatedStrings[i].sha256()).sha256();
    }
    let diff = (info.systemUptime - begin);
    let hashPerSec = Double(generatedStrings.count) / diff;

    let alert = UIAlertController(title: "Hash Rate", message: "Your hash rate is \(hashPerSec) h/s", preferredStyle: .alert);
    alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
    self.present(alert, animated: true)

}

如果输出结果,我每秒将得到24000个哈希!尽管我毫不怀疑我的IOS设备(iPhone SE)是奇迹的创造,但我很确定它的性能不会超过CryptoSwift超过200%。

很明显,尽管我喜欢看到如此惊人的结果,但我仍然怀疑我的理解甚至是代码中的谬论或错误。

我在计算哈希率时出了什么问题?

2 个答案:

答案 0 :(得分:0)

我希望哈希率受正在哈希的字符串大小的影响。您链接到的原始文章没有描述正在散列的内容,对于加密货币开发人员而言,这也许是显而易见的。

您可以通过对每个测试使用生成的长度相同的字符串进行几次测试来进行测试。但是在测试之间更改该长度。

答案 1 :(得分:0)

结果虽然有所不同,但却是计算哈希率的真正方法。如by this answer所述,可以对其进行优化以使其表现更好。上面唯一需要做的修改就是代替UUID使用可变长度的字符串(但是,如衬线描述中所述,长度为80个字符,可以根据工程策略进行修改)。

func generateRandomStrings(numStrings: Int, lenString: Int) -> [String] {
    var randomStrings = [String]();
    for _ in 0..<numStrings {
        randomStrings.append(randomStringWithLength(length: lenString));
    }
    return randomStrings;
}

func randomStringWithLength (length : Int) -> String {
    let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    let len = UInt32(letters.length)
    var randomString = ""
    for _ in 0 ..< length {
        let rand = arc4random_uniform(len)
        var nextChar = letters.character(at: Int(rand))
        randomString += NSString(characters: &nextChar, length: 1) as String
    }
    return randomString;
}

然后,要创建一个可以测试的字符串数组(在这种情况下为500),可以使用以下代码:

let generatedStrings = HashingUtils().generateRandomStrings(numStrings: 500, lenString: 80);