murmurhash64B c# c

本文介绍了如何在C#和C/C++中实现MurmurHash64B算法,提供了详细的代码示例,帮助读者理解和应用这个高效的哈希函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c#版:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace gjh.utility
{
    public class MurmurHash64B
    {
        public static ulong MakeHashValue(byte[] key, uint seed = 0xee6b27eb)
        {
            uint len = (uint)key.Length;
            const uint m = 0x5bd1e995;
            const int r = 24;

            uint h1 = seed ^ len;
            uint h2 = 0;
            int pos = 0;

            while (len >= 8)
            {
                uint k1 = System.BitConverter.ToUInt32(key, pos);
                pos += 4;
                k1 *= m; k1 ^= k1 >> r; k1 *= m;
                h1 *= m; h1 ^= k1;
                len -= 4;

                uint k2 = System.BitConverter.ToUInt32(key, pos);
                pos += 4;
                k2 *= m; k2 ^= k2 >> r; k2 *= m;
                h2 *= m; h2 ^= k2;
                len -= 4;
            }

            if (len >= 4)
            {
                uint k1 = System.BitConverter.ToUInt32(key, pos);
                pos += 4;
                k1 *= m; k1 ^= k1 >> r; k1 *= m;
                h1 *= m; h1 ^= k1;
                len -= 4;
            }

            if (len == 3)
            {
                h2 ^= (uint)key[2] << 16;
                h2 ^= (uint)key[1] << 8;
                h2 ^= key[0];
                h2 *= m;
            }
            else if (len == 2)
            {
                h2 ^= (uint)key[1] << 8;
                h2 ^= key[0];
                h2 *= m;
            }
            else if (len == 1)
            {
                h2 ^= key[0];
                h2 *= m;
            }

            h1 ^= h2 >> 18; h1 *= m;
            h2 ^= h1 >> 22; h2 *= m;
            h1 ^= h2 >> 17; h1 *= m;
            h2 ^= h1 >> 19; h2 *= m;

            ulong h = h1;

            h = (h << 32) | h2;

            return h;
        }

        public static ulong StringToHashValue(string source)
        {
            byte[] bytes = System.Text.Encoding.Default.GetBytes(source);
            return MakeHashValue(bytes);
        }
    }
}


c/c++版:

static unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed )
{  
    const unsigned int m = 0x5bd1e995;  
    const int r = 24;  
   
    unsigned int h1 = seed ^ len;  
    unsigned int h2 = 0;  
   
    const unsigned int * data = (const unsigned int *)key;  
   
    while(len >= 8)  
    {  
        unsigned int k1 = *data++;  
        k1 *= m; k1 ^= k1 >> r; k1 *= m;  
        h1 *= m; h1 ^= k1;  
        len -= 4;  
   
        unsigned int k2 = *data++;  
        k2 *= m; k2 ^= k2 >> r; k2 *= m;  
        h2 *= m; h2 ^= k2;  
        len -= 4;  
    }  
   
    if(len >= 4)  
    {  
        unsigned int k1 = *data++;  
        k1 *= m; k1 ^= k1 >> r; k1 *= m;  
        h1 *= m; h1 ^= k1;  
        len -= 4;  
    }  
   
    switch(len)  
    {  
    case 3: h2 ^= ((unsigned char*)data)[2] << 16;  
    case 2: h2 ^= ((unsigned char*)data)[1] << 8;  
    case 1: h2 ^= ((unsigned char*)data)[0];  
            h2 *= m;  
    };  
   
    h1 ^= h2 >> 18; h1 *= m;  
    h2 ^= h1 >> 22; h2 *= m;  
    h1 ^= h2 >> 17; h1 *= m;  
    h2 ^= h1 >> 19; h2 *= m;  
   
    unsigned long long h = h1;  
   
    h = (h << 32) | h2;  
   
    return h;  
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值