我正在寻找一种快速散列算法,它不用于密码学,但给我比标准更好的覆盖率GetHashCode()
。
我见过CityHash
但看不到 C# 端口。
理想情况下,我想指定哈希大小(64 位、128 位等......),但这不是必需的。
有任何想法吗?
CityHash C# 端口
https://github.com/gmarz/CityHash
用法:
using CityHash;
ulong hash = "...".GetCityHash64();
您需要从主项目添加对 CityHash.dll 的引用,并确保从项目的 C++ 部分构建的 CityHash.Win32.dll 在项目的 bin 文件夹中可用。
对我来说,使用 git 是个大麻烦——我不想检查 bin 文件夹中的任何内容。因此,我将 Win32 dll 放在我的 lib 文件夹中并添加了这个 Pre-build 事件:
start /MIN xcopy /y /c lib\CityHash.Win32.dll bin
这确保了它可以复制,即使对于刚刚克隆和构建的人,也不必将 bin 文件夹从 .gitignore 列表中删除。
另请注意,据我所知,CityHash 的 C++ 部分不会在 Visual Studio 的发布模式下构建 - 仅限调试。
您可以尝试这样的事情:对于 64 位哈希
bit Data[64*L] ; // Your input filled to be divided by 64
bit Arr[64] ; // eg. initially filled with '0'
for(int k=0 ; k<L ; k++){
for(int i=0 ; i<64 ; i++){
Arr[i]=Arr[i]^data[k*64+i]; // '^' as the XOR operator
}
}
Arr[] 将获得 64 位快速高效的哈希。