linux c/c++ 后台开发常用算法之:一致性哈希算法

Linux C/C++ 服务器/后端开发/后台开发学习路线 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」。 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学习资源和书单推荐,更要细化如何有效的去执行落地。 争取做到让看到的同学有一种相见恨晚的感觉哈哈哈。 所以大家可以试着看一下,帮我检查下有没有达到预想的效果哈哈,希望不要被打脸???? 那就正式开始吧。 这篇文章会有点长有点干,可以先去冲杯咖啡,收藏关注一波慢慢看~ 正文 | 干货 |收藏【文末附上学习路线 阅读详情

一致性哈希主要应用在大规模高可用性的分布式存储上,尤其是KV存储上面,比如memcaced, redis 集群,相比普通hash % N 的优点在于,但优点是增加或者删除节点的时候,数据的迁移会比较小,通常只有部分抖动和迁移。但是其相对于hash %N 的缺点数据均匀性肯定不如 hash %N 尤其是数据的key在一个较小的范围内,容易出现均匀的现象,但是可以通过hash函数调优,以及增加虚拟节点的方法来降低不均匀性。下面试自己写的一个c++版本的一致性哈希算法,其中m5算法是上一篇博客的代码

/**********************************
function: consistent hash 
author: liuyi
date: 2015.10.31
viersion: 1.0
**********************************/

#ifndef CONSISTENT_HASH_H
#define CONSISTENT_HASH_H

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <set>
#include <map>
#include <string>
#include <vector>
#include "md5.h"
using namespace std;

inline unsigned int hash_fun(const char* key)
{
	unsigned int hash = 0;  
	unsigned int seed = 131;  
	unsigned int len = strlen(key);  
	for(int i = 0; i < len; i++)  
	{  
		hash = (hash * seed) + key[i];
	}  
	return hash;  
}

typedef unsigned int(*hash_fun_ptr)(const char*);

class consistent_hash
{
	public:
		consistent_hash()
		{
			m_virtual_node_mulriple = 1;
		}

		~consistent_hash()
		{
			m_node_map.clear();
		}

		bool init(const vector<string>& node_vect, 
				  const int& virtual_node_mulriple,
				  const hash_fun_ptr& hash_func = hash_fun);

		size_t get_virtual_node_hash(const string& node, vector<unsigned int>& virtual_node_hash_vec);

		bool add_node(const string& node);

		bool del_node(const string& node);

		string get_node(const string& key);

		size_t get_all_node(set<string>& nodes);

		size_t get_node_count();

	private:
		int m_virtual_node_mulriple;
		map<unsigned int, string> m_node_map;
		hash_fun_ptr m_hash_func;
};

#endif 


/**********************************
function: consistent hash 
author: liuyi
date: 2015.10.31
viersion: 1.0
**********************************/

#include "consistent_hash.h"

bool consistent_hash::init(const vector<string>& node_vect, 
				  const int& virtual_node_mulriple,
				  const hash_fun_ptr& hash_func)
{
	if(node_vect.empty())
		return false;

	m_virtual_node_mulriple = virtual_node_mulriple;
	m_hash_func = hash_func;
	for(size_t i = 0; i < node_vect.size(); i++)
	{
		vector<unsigned int> virtual_node_hash_vec;
		get_virtual_node_hash(node_vect[i], virtual_node_hash_vec);
		for(size_t j = 0; j < virtual_node_hash_vec.size(); j++)
		{
			m_node_map[virtual_node_hash_vec[j]] = node_vect[i];
		}
	}

	return true;
}

size_t consistent_hash::get_virtual_node_hash(const string& node, vector<unsigned int>& virtual_node_hash_vec)
{
	virtual_node_hash_vec.clear();
	virtual_node_hash_vec.reserve(m_virtual_node_mulriple*4+1);
	for(int i = 0; i < m_virtual_node_mulriple; i++)
	{
		char virtual_node[256] = {0};
		sprintf(virtual_node, "%s#%u", node.c_str(), i);
		MD5 md5;
		md5.update(virtual_node);
		const unsigned char* digest = md5.digest();
		for(int h = 0; h < 4; h++)
		{
			unsigned int hash_value = ((unsigned int)(digest[3+h*4]&0xFF) << 24) 
									  |((unsigned int)(digest[2+h*4]&0xFF) << 16)
									  |((unsigned int)(digest[1+h*4]&0xFF) << 8)
									  |(digest[h*4]&0xFF);

			virtual_node_hash_vec.push_back(hash_value);
		}
	}

	return virtual_node_hash_vec.size();
}

bool consistent_hash::add_node(const string& node)
{
	vector<unsigned int> virtual_node_hash_vec;
	if(0 == get_virtual_node_hash(node, virtual_node_hash_vec))
		return false;

	for(size_t i = 0; i < virtual_node_hash_vec.size(); i++)
	{
		m_node_map[virtual_node_hash_vec[i]] = node;
	}

	return true;
}

bool consistent_hash::del_node(const string& node)
{
	vector<unsigned int> virtual_node_hash_vec;
	if(0 == get_virtual_node_hash(node, virtual_node_hash_vec))
		return false;

	for(size_t i = 0; i < virtual_node_hash_vec.size(); i++)
	{
		m_node_map.erase(virtual_node_hash_vec[i]);
	}

	return true;
}

string consistent_hash::get_node(const string& key)
{
	if(m_node_map.empty())
		return "";

	unsigned key_hash = m_hash_func(key.c_str());
	map<unsigned int, string>::iterator it = m_node_map.lower_bound(key_hash);
	if(it == m_node_map.end())
	{
		return m_node_map.begin()->second;
	}

	return it->second;
}

size_t consistent_hash::get_all_node(set<string>& nodes)
{
	nodes.clear();
	for(map<unsigned int, string>::iterator it = m_node_map.begin(); 
		it != m_node_map.end();
		++it)
	{
		nodes.insert(it->second);	
	}

	return nodes.size();
}

size_t consistent_hash::get_node_count()
{
	set<string> nodes;
	return get_all_node(nodes);
}


#include <iostream>
#include "consistent_hash.h"

int main()
{
	consistent_hash c;
	vector<string> a;
	a.push_back("192.10.59.1:80");
	a.push_back("192.10.59.2:80");
	a.push_back("192.10.59.3:80");
	a.push_back("192.10.59.4:80");
	a.push_back("192.10.59.5:80");
	c.init(a, 1);
	set<string> nodes;
	cout<<c.get_all_node(nodes)<<endl;
	cout<<c.del_node("192.10.59.1:80")<<endl;
	cout<<c.get_all_node(nodes)<<endl;
	cout<<c.add_node("192.10.59.1:80")<<endl;
	cout<<c.get_all_node(nodes)<<endl;
	for(int i = 0; i < 10000000; i++)
	{
		char b[1024] = {0};
		sprintf(b, "%d", i);
		string t = b;
		cout<<"node="<<c.get_node(t)<<endl;
	}
}




程序员告诉你:C/C++后台开发需要学习哪些技能书 前言:后台开发工程师主流使用的编程语言有C++、Java、PHP以及目前慢慢流行的Golang等。小编就将以C++的角度,讲讲如何学习和准备后台开发的岗位。 一、语言基础 无论是C++开发还是Java开发,对于一个码农而言,最重要的就是对于编程语言的熟悉。同样,无论从事哪种类型的岗位,首当其冲的就是要掌握好语言基础。 C++是一门博大精深的编程语言,不仅拥有继承于C语言的过程化程序设计思想,还包含有面对对象(OOP)的设计理念。强大而又复杂。相对来说,C++的学习成本较高,语言里面的坑较多。. 阅读详情

相关推荐

【Linux】C++后台开发面试

本文将讲述(Linux)服务器后台开发岗位的要求,包含了大部分会遇到的面试题目。掌握文中提到的技术,也算少许入门水平了,此文既是面经,也是后台开发的入门手册。无论社招还是校招,都可作为一个参考。 本文内容收集自知乎和其他博客,在此整理成章。 校招:以C++基础为主,数据结构和常见算法(ACM经典题目)是必须掌握的。 技术类面试跟学校的经验 / 社团经验 / 学习成绩 挂钩不太高,当然不是说两者...

不知鲸又是鱼 6393

每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

五分钟让你深入了解分布式系统中常用的一致性哈希算法

Cynric 的博客 50万+

Linux 服务器开发学习路线总结(配图 c/c++ )后台开发、Golang后台开发、后端技术栈

本文总结了目前互联网行业Linux c/c++ 后端岗位开发工程师、服务器开发架构师以及Golang开发工程师技术栈知识点、大家可以看看还有没有需要补充的。 Linux后台开发工程师专栏 一、算法与设计专题 二、后台组件编程专题 三、代码化过程专题 视频文档资料获取+1035101242(VX同号)。 系统学习视频链接:https://ke.qq.com/course/417774?flowToken=1013189 四、网络服务专题 ...

Linuxhus的博客 2546

glib中hash table

Glib是一个C语言编写的库,它本身是Gnome的一个部分,后来Glib剥离出来,它为Gnome提供了一些操作字符串和常用数据结构的工具函数。这些好的工具函数既然可以提供给gnome,使用,自然也可以提供给我们使用。(靠,这逻辑,怎么这么像 和尚摸的,我自然也摸的,晕死啊)。最近看到我们老大用了Glib的hash表,在工期紧急的情况下解决了一个功能扩展的问题,所以我也就动了玩玩Glib的心思。

很多时候,你缺少的不是知识而是热情 5924

linux c 写的hash算法的编程

linux c 写的hash算法的编程

一致性哈希算法C版实现

一致性哈希算法,广泛应用于分布式计算,C版实现,属于分布式服务器管理的核心算法。

一个Netfilter nf_conntrack流表查找的优化-为conntrack增加一个per cpu cache

独悲需要忍受,快乐需要分享 对Linux协议栈多次perf的结果,我无法忍受conntrack的性能,然而它的功能是如此强大,以至于我无法 对其割舍,我想自己实现一个快速流表,但是我不得不抛弃依赖于conntrack的诸多功能,比如state match,Linux NAT等,诚然,我虽然对NAT也是抱怨太多,但不管怎样,不是还有很多人在用它吗。 ...

weixin_34050427的博客 196

n8n 快速入门1:构建一个简单的工作流

n8n 快速入门指南

engchina的专栏 1万+

Linux内核中hash函数的实现

作者:Gao Peng&lt;gaopenghigh@gmail.com&gt; 本文章由Gao Peng编写,转载请注明出处。 原文地址:http://blog.youkuaiyun.com/gaopenghigh/article/details/8831312 Linux内核中通过PID查找进程描述符(task_struct)时,用到了hash表。下面介绍一下这一部分内核中...

836811384 2082

矿卡CMP 170HX的AI推理性能优化实战

GPU计算在现代AI推理中扮演着核心角色,其并行计算架构特别适合处理神经网络的大规模矩阵运算。通过CUDA指令集优化和计算管线重构,可以显著提升硬件利用率,这在边缘计算和带宽敏感型任务中尤为重要。以NVIDIA CMP 170HX矿卡为例,通过禁用FMA指令和框架适配优化,其FP32性能可提升15.9倍,在Qwen2.5-1.5B模型的4-bit量化推理中达到A100同架构78%的解码速度。这种优化技术不仅让淘汰矿卡重获新生,更为边缘AI部署提供了高性价比解决方案,特别适合7B以下量化模型部署和多路视频分析

weixin_30432579的博客 624

【元宵快乐】猜灯谜吃元宵 元气满满闹元宵~(附猜灯谜小游戏)

导语 元宵节,又称上元节、灯节,是春节之后的第一个重要节日。 相传,汉文帝(前179—前157年)为庆祝周勃于正月十五勘平诸吕之乱,每逢此夜,必出宫游玩,与民 同乐,在古代,夜同宵,正月又称元月,汉文帝就将正月十五定为元宵节。 随着社会和时代的变迁,元宵节的风俗习惯在不断变化,但至今仍是中国的传统节日。2008年, 元宵节选入第二批国家级非物质文化遗产。 对我而言,除了吃元宵、看花灯……还有一件最重要的事情…就是… 猜灯谜!猜灯谜!!猜灯谜!!!猜谜事小,展现聪明才智事大哈哈哈.jpg .

顾木子吖的博客 2097

c/c++linux后台服务器开发如何提升?(路线图已备好)

随着业务市场的不断壮大,更便捷的开发语言也越来越受到市场的欢迎。Java,python还有新贵golang。 那c/c++语言的开发者市场在哪里。虽然说没有活干说的可能过于夸张,但是面临的事实就是比不了。可能初学一点Java,python等等就能找到一份不错的开发工作,但是如果你只会一点c,又不是校招的话,能找到哪些工作呢? C,c++不同于Java。Java的技术路线是比较固定的,学好技术栈...

资料qun832218493 1万+

Arduino I2C for TCA9548A应答扫描程序

Arduino I2C for TCA9548A应答扫描程序

perseverance51博客 1119

C/C++后台开发需要点亮哪些技能树||(鹅厂为例)

前言 首先一般公司分为前端和后端,前端就是和用户打交道的,负责用良好的视觉效果将数据呈现给用户,广义的前端包括客户端(安卓、IOS)、Web前端、小程序等。 而与之对应的后端则是负责业务逻辑处理,比如下单、支付等,重在业务流程的处理。 后台一般和后端是一个意思,而服务器开发则稍微广义一点,不仅包含了后台开发,而且也包括支撑整个后台应用的基础开发,比如搜索引擎、微服务、RPC 框架、KV、存储、MQ 等。 后台/后端重在业务处理,是偏向应用层开发,而服务器开发不仅包括应用层开发,更是囊括了整个支撑后台业务的相

C/C++Linux、音视频、DPDK 3272

使用 ABAP 代码动态创建新的 Function Module

通过内表。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6905

【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?

家里的路由器背后总有几个网线接口,有的标着 “LAN”,有的标着 “WAN”;公司机房的路由器上,接口更是五花八门,有的插着网线,有的连着光纤,旁边还贴着 “GE0/0/1”“Eth-Trunk1” 这样的标签。你可能会想:不就是插网线的地方吗?有啥区别?其实,这些接口分 “二层接口” 和 “三层接口”,它们的作用差得远了 —— 就像你家的门,有的是 “小区内的单元门”(只通小区内部),有的是 “小区的大门”(能通往外面的世界)。接下来,咱们用大白话 + 生活例子,一点点把这两种接口讲透。

jundao1997的专栏 564

关于Linux C/C++ 服务器/后台开发学习路线总结

这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其它人写得不一样, 也定下了一个目标,这篇文章,不能是简单的堆砌学习资源和书单推荐,更要细化如何有效的去执行落地。 争取做到让看到的同学有一种相见恨晚的感觉哈哈哈。 所以大家可以试着看一下,帮我检查下有没有达到预想的效果哈哈,希望不要被打脸???? 那就正式开始吧。 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 一、后端/后台/服务器开发? 经常在各大公司招聘上看到后端、后台、服务器开发等等,有些同学经常被这些名词搞混。 其实这些名词都是相近的

资料qun832218493 2390

【华为OD机试真题】7、字符串筛选排序 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母(k>=1) 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引 如果有重复字母则输出字母的最小位置索引

KJ.JK 2266

C++后台开发

转自作者:AJ,自己留着学习。 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗。不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发。 后台开发工程师主流使用的编程语言有C++、Java、PHP以及目前慢慢流行的Golang等。本文就将以C++的角度,讲讲如何学习和准备后台开发的岗位。 一、语言基础 无论是C++开发还是Java开发,对于一个码农而言,最重要的就是对于编程语言的熟悉。同样,无论从事哪种类型的...

人面桃花 3605

【100%通过率】华为OD机试真题 Python 实现【网上商城优惠活动 / 模拟商场优惠打折II】

某网上商场举办优惠活动,发布了满减、打折、无门槛3种 优惠券,分别为: 1:每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推; 2:92折券,1次限使用1张,如100元,则优惠后为92元, 3:无门槛5元优惠券,无使用数限制,直接减5元。

MISAYAONE的博客 9369

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C/C++ 服务器/后台开发学习路线总结及准备

文章目录一、前言二、总结网上的学习路线三、之前的一些相关博客整理 一、前言 最近要新开一个非常重要的系列,C/C++ 服务器/后台开发。 这个系列将会包括非常多的内容,难度也会比之前的系列大很多,会有很多源码级的学习,大的项目的练习,工具的使用,业务逻辑的理解等。 因此这篇文章先来总结了解一些大佬们的推荐学习路线,了解一下合适的学习路线和学习方法。 除此之外,也会先整理一下之前一些和此相关的博客,温习一下,打一些基础。 二、总结网上的学习路线 在网上找了几个排名靠前的回答: 肝!Linux C/C++ 服务

qq_41854911的博客 5804

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

c/c++后台开发前景到底如何?该如何提升?

最近听到很多人都在讲:在这个Java热火朝天,人工智能高能吹捧的市场,c/c++开发人员还有人要? 小编想说的是:有,而且很多企业都是有在招c/c++开发人才。 只是IT这个行业:普遍高端稀缺,中端平衡,低端饱和。 后台开发第330讲|c/c++开发方向如何选择,嵌入式,qt/mfc,游戏开发,后端开发| c/c++为什么开发方向多样?|为什么不推荐 qt/mfc c/c++的难度系数比其他语言都高。所以愿意去选择他的人数一年比一年少。 如果时间充足,对c/c++比较感兴趣的伙伴 ,可以

Linux高级开发的博客 7783

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++开发环境

如同, 缺少了对cJSON的编译,这里对成员函数的所需的c/cpp文件未被编译。也就是按单文件编译方法对多文件进行编译。解决办法:在tasks.jason 中设置源文件,将"args"的值语言CC++C/C++这里的 ${fileDirname} 表示当前目录。

Watom_663的博客 3287

这才是你需要的C/C++Linux服务器后台开发学习路线!

C语言和C++属于“造轮子”语言,几乎什么都能做。不过一般来说,C语言和C++主要还是做后台(服务端)开发比较多,包括: 通信公司后台开发 互联网公司后台开发 游戏公司后台开发 …… 当然这个后台开发具体职责又有很多细分,比如: 有做数据处理和分析的 有做基础协议和通信的 有做服务端底层应用优化的 甚至还有做后台系统驱动和内核的 …… 从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪? C/C++,它和Java确实不太一样。C语言和C++,尤其C++,语言粒度细、机制多,性能虽然高,但语言本

C/C++Linux、音视频、DPDK 1596

C/C++Linux后台开发(入门到精通) 学习路线-架构师篇

前言:小编也是从事c方面10多年的工作经验、今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线。从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架构师。想必大家都知道从事后台开发首先就是要选择一种语言,小编今天跟大家分享是用C/C++ 做的后台开发。所以想从事这方面的朋友得有C/C++的基础。 首先跟大家说的是从学习步骤:(Linux入门到精通篇)。 一、Linux开发环境 1.了解Linux环境搭建,了解LinuxC编程 2.了解Linux安装,命.

嵌入式Linux内核的博客 1746

linux c/c++ 后台开发常用算法之:md5算法c++版实现

MD5即Message-Digest Algorithm 5(消息摘要算法第五版)的简称,是当前计算机领域用于确保信息传输完整一致而广泛使用的散列算法之一(又译哈希算法、摘要算法等),主流编程语言普遍已有MD5的实现。将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础, 下面是c++版的MD5算法实现 #include

实践是检验真理的唯一标准 3049
上一篇: linux c/c++ 后台开发常用算法之:md5算法c++版实现
下一篇: shuffle算法及应用
菜鸟懿
博客等级 码龄14年 98粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值