CityHash允许我们生成128位哈希,但是整数的128位表示被定义为一对uint64
s(如header of CityHash.h中所示):
typedef boost::uint64_t uint64;
typedef std::pair<uint64, uint64> uint128;
我有一个.NET包装器,允许我调用64位版本的城市哈希:
public ref class CityHashDotNet
{
public:
inline static void CityHash64Batch(const char* const value, uint64* const hashes, const int numValues)
{
// I have a wrapper for CityHash that allows me to make batch calls (saves on interops)
CityHashWrapper::CityHash64Batch(value, hashes, numValues);
}
//...
}
这允许我通过将值存储器指针强制转换为sbyte*
并将散列存储器指针转换为ulong*
并调用CityHashDotNet
包装函数,轻松地从C#生成散列:
// The MemoryPointer is an IntPtr
CityHashDotNet.CityHash64Batch((sbyte*)values.MemoryPointer, (ulong*)hashes.MemoryPointer, size);
我想围绕128位版本的城市哈希创建一个包装器,但我不知道如何对哈希所需的std::pair
进行编组。我定义了一个与std::pair
匹配的类,我打算用它来复制std::pair
结构:
public class Pair<T1, T2>
{
public T1 First { get; set; }
public T2 Second { get; set; }
public Pair(T1 first, T2 second)
{
First = first;
Second = second;
}
}
问题在于我无法将IntPtr
转换为std::pair<ulong,ulong>*
(ulong
与uint64
相同)。我尝试将其转换为Pair<ulong,ulong>*
,但我收到了构建错误:
// Does not work!
CityHashDotNet.CityHash128Batch((sbyte*)values.MemoryPointer, (Pair<ulong,ulong>*)hashes.MemoryPointer, size);
我得到的错误是:
error CS1503: ... cannot convert from `Pair<ulong,ulong>*` to `std.pair<unsigned __int64,unsigned __int64>*`
如何解决此问题?
答案 0 :(得分:3)
您不能在指向这些类型的指针之间进行转换,它们没有兼容的布局。您必须在每种类型的数组之间复制数据,一次一个字段。在C ++ / CLI代码中执行此操作,并让C#代码看到漂亮的.NET数组。