D语言无符号哈希的字符串

时间:2015-07-23 18:02:02

标签: hash d

我是D language的完全初学者。

如何在D语言中得到uint无符号32位整数,字符串的一些散列......

我需要一个快速而又脏的哈希码(我不太关心"随机性"或者"缺少冲突"我更关心性能)

 import std.digest.crc;
 uint string_hash(string s) {
    return  crc320f(s);
 }

不好......

(在Linux / x86-64上使用gdc-5使用phobos-2)

2 个答案:

答案 0 :(得分:8)

虽然亚当斯的回答完全符合您的要求,但您也可以使用联盟进行投射。 这是一个非常有用的技巧,所以也可以把它放在这里:

/**
  * Returns a crc32Of hash of a string
  * Uses a union to store the ubyte[]
  * And then simply reads that memory as a uint
  */
uint string_hash(string s){ 
    import std.digest.crc;
    union hashUnion{
        ubyte[4] hashArray;
        uint hashNumber;
    }   
    hashUnion x;
    x.hashArray = crc32Of(s); // stores the result of crc32Of into the array.
    return x.hashNumber;      // reads the exact same memory as the hashArray
                              // but reads it as a uint.
}

答案 1 :(得分:5)

一件非常快的事情可能就是这样:

uint string_hash(string s) { 
    import std.digest.crc; 
    auto r = crc32Of(s); 
    return *(cast(uint*) r.ptr); 
} 

由于crc32Of会返回ubyte[4]而不是您想要的uint,因此转换是必要的,但由于ubyte[4]uint是相同的在机器上,我们可以用指针技巧重新解释一下,在运行时可以免费转换类型。