我是D language的完全初学者。
如何在D语言中得到uint
无符号32位整数,字符串的一些散列......
我需要一个快速而又脏的哈希码(我不太关心"随机性"或者"缺少冲突"我更关心性能)
import std.digest.crc;
uint string_hash(string s) {
return crc320f(s);
}
不好......
(在Linux / x86-64上使用gdc-5
使用phobos-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
是相同的在机器上,我们可以用指针技巧重新解释一下,在运行时可以免费转换类型。