首页 > 编程语言 >murmurhash64B c# 实现 c++ 实现

murmurhash64B c# 实现 c++ 实现

时间:2023-10-26 17:15:11浏览次数:41  
标签:int k2 c# h1 c++ h2 k1 len murmurhash64B

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++实现:

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;  
}

吐槽一下csdn童鞋,,,文章留着自己玩吧,反正别人也看不着。fuck

标签:int,k2,c#,h1,c++,h2,k1,len,murmurhash64B
From: https://www.cnblogs.com/uniqs/p/17789840.html

相关文章

  • Tomcat编码和Sevlet继承关系
    1.设置编码tomcat8之前设置编码:(1).get请求方式:get方式目前不需要设置编码(基于Tomcat8)如果时get请求发送的中文数据,转码稍微比较麻烦(Tomcat8之前)tomcat8之前转码方式:/*Stringfnama(属性名,可随意设置)=request.getParameter("fnama");1.将字符串打散成字节数组byte[......
  • C++ 与 QML 之间进行数据交互的几种方法
    一、属性绑定这是最简单的方式,可以在QML中直接绑定C++对象的属性。通过在C++对象中使用Q_PROPERTY宏定义属性,然后在QML中使用绑定语法将属性与QML元素关联起来。person.h#include<QObject>classPerson:publicQObject{Q_OBJECT/*使用Q_PROPERTY定义交......
  • Unity anchoredPosition转localPosition
    参考https://zhuanlan.zhihu.com/p/119442308在已经有结果的情况下,先捋一下unity对相关字段的注释就能得出很多公式(rectMinPos表示左下角在父节点坐标系中的位置,其他以"Pos"结尾的字段同理)pivot:ThenormalizedpositioninthisRectTransformthatitrotatesaround.......
  • 2023年秦皇岛CCPC赛后总结zx
    签到题zzh很快就过了,后面J题一开始想原题,但是不知道怎么写了,还是lhy最后用暴力过了,到这里速度还是很快的,但是A题是个偏思维的构造题,一开始就是想着局部的进行构造然后扩展到整体,试了几发总是wa也是没有头绪了,加上后面过的人多了就着急也是又wa了几发,后面发现时想复杂了,只需要......
  • 18.3 NPCAP自定义数据包过滤
    NPCAP库是一种用于在Windows平台上进行网络数据包捕获和分析的库。它是WinPcap库的一个分支,由Nmap开发团队开发,并在Nmap软件中使用。与WinPcap一样,NPCAP库提供了一些API,使开发人员可以轻松地在其应用程序中捕获和处理网络数据包。NPCAP库可以通过WinPcapAPI进行编程,因此现有的Win......
  • 如何在 CURL 命令行中配置代理服务器
    CURL是一个常用的命令行工具,用于在终端中发送和接收HTTP请求。有时候,我们需要通过代理服务器来访问互联网资源,这时候就需要在CURL命令行中设置代理。下面是如何在CURL命令行中使用代理服务器的步骤:1.指定代理服务器地址和端口号在CURL命令行中,使用-x或--proxy选项指......
  • 如何在 Wget 中使用 Command Line Arguments 设置代理
    在使用Wget这个命令行工具进行文件下载时,有时我们需要通过代理服务器来进行网络连接。Wget提供了一些命令行参数,可以让我们设置代理服务器的信息。下面是如何在Wget中使用CommandLineArguments设置代理的步骤。首先,我们需要打开终端或命令提示符窗口,并进入到Wget的安装......
  • P4182 [USACO18JAN] Lifeguards P
    P4182[USACO18JAN]LifeguardsP更好的阅读体验提供一个比较优秀大常数的时间\(\mathcalO(nm)\),空间线性的做法。由于变量名冲突,本文中\(m\)均指题目中的\(k\)。推推性质,发现若区间包含了另一个区间,则一定删掉被包含的区间,正确性显然。这样我们得到了一些左右端点都递增......
  • Dynamics CRM中自定义页面实现附件管理包含下载模板、上传、下载、删除
    前言附件使用的DynamicsCRM平台本身的注释表annotation存储,将附件转换成二进制字节流保存到数据库中,因自带的注释在页面中显示附件不够直观,特做了一个单独的附件管理自定义页面,通过CRM自定义按钮打开对话框的方式展示附件列表页面。同时支持下载附件模板,页面为简单的H5+Bootstr......
  • c# winfom从0学习开发开发OA、BPM工作流程与自定义表单系统(七)流程中心-分类管理
    分类管理分为两块一块流程分类一块 表单分类两块分类的主要功能是为了让流程或者表单有条理,看起来不是那么凌乱,例如请假流程或者活动流程都可以创建属于自己的分类,方便自己也方便别人使用后面再新建流程和新建表单的时候会再次细说 ......