哈希环算法(C语言版本)

文章目录

    • 理论分析:
    • 经典案例
      • 案例一:开放寻址法
      • 案例二:经典哈希环算法案例
        • 总结

理论分析:

所谓的哈希环就是就是数据结构里面的数组,只不过我们通过设置使其首尾相连,而这个数组又非常的大,这些大量的元素空间就可以用于存放我们的哈希映射点。在haproxy当中,该算法进行哈希的时候是以IP地址进行哈希,并不是以权值进行哈希,请勿绕晕。

经典案例

案例一:开放寻址法

链接如下:
https://blog.csdn.net/qq_64304610/article/details/141063561?spm=1001.2014.3001.5501

开放寻址法的大致思想回合哈希环的思想一致,只不过开发寻址法的算法题目没有要求首尾相连,但是其思路简单,易于理解。

案例二:经典哈希环算法案例

题目名称:基于哈希环的数据分布与负载均衡

题目描述:
假设你正在为一家在线零售商设计一个分布式缓存系统,该系统需要处理大量的商品查询请求。为了提高查询效率和系统的可扩展性,你决定使用哈希环算法来分布数据和负载均衡。系统中有多个缓存节点,每个节点负责存储一部分商品数据。当客户端发起商品查询请求时,系统需要根据商品ID将请求路由到对应的缓存节点。

要求: 设计一个简单的哈希函数,将商品ID映射到哈希环上。 实现一个负载均衡器,根据哈希环上的位置选择合适的缓存节点来处理请求。
考虑节点的添加和删除情况,确保系统的容错性和可扩展性。 输入:

商品ID列表 缓存节点列表 客户端查询请求(包含商品ID)
输出: 每次查询请求对应的缓存节点编号

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>// 定义哈希环的大小,这里定义了哈希环的大小为2的20次方,即哈希环的范围是从0到2^20-1。
int RING_SIZE=(1<<20); // 定义缓存节点结构体
typedef struct {int id; //id表示缓存节点的唯一标识unsigned int hash; //hash表示该节点在哈希环上的位置。
} CacheNode; //定义了一个名为CacheNode的结构体// 简单哈希函数
unsigned int simple_hash(const char *str) {unsigned int hash = 0;while (*str) {hash = hash * 31 + *str++;}return hash % RING_SIZE;
}/*这是一个简单的字符串哈希函数,它使用了一个基本的乘法散列策略。对于输入的字符串,它会遍历每个字符,并将字符的ASCII值乘以31后累加到hash变量上。最后,对哈希值取模RING_SIZE,确保哈希值落在哈希环的有效范围内。
*/// 初始化缓存节点
void init_cache_node(CacheNode *node, int id, const char *data) {node->id = id;node->hash = simple_hash(data);
}
/*
这个函数用于初始化一个CacheNode结构体。
它接受一个指向CacheNode的指针、一个节点ID和一个数据字符串作为参数。
函数设置节点的ID,并计算数据字符串的哈希值,将其赋给节点的hash成员。
*/// 查找最近的缓存节点
/*
这个函数用于在哈希环上查找距离给定键哈希值最近的缓存节点。
它遍历所有缓存节点,找到第一个哈希值大于或等于键哈希值的节点,
并返回其ID。如果没有找到这样的节点,则返回第一个节点的ID。
*/
int find_nearest_node(CacheNode *nodes, int num_nodes, unsigned int key_hash) {int nearest_node = -1;for (int i = 0; i < num_nodes; ++i) {if (nodes[i].hash >= key_hash) {nearest_node = nodes[i].id;break;}}if (nearest_node == -1) {// 如果哈希环上没有找到比key_hash大的节点,则返回第一个节点nearest_node = nodes[0].id;}return nearest_node;
}int main() {// 假设有3个缓存节点CacheNode nodes[3];init_cache_node(&nodes[0], 0, "node0");init_cache_node(&nodes[1], 1, "node1");init_cache_node(&nodes[2], 2, "node2");// 商品ID列表const char *product_ids[] = {"product1", "product2", "product3"};// 客户端查询请求const char *query_id = "product2";// 计算查询请求的哈希值unsigned int query_hash = simple_hash(query_id);// 查找最近的缓存节点int nearest_node = find_nearest_node(nodes, 3, query_hash);printf("产品“%s”的查询应由%d缓存节点处理 \n", query_id, nearest_node);return 0;
}
总结

这段代码定义了一个简单的哈希函数simple_hash,用于将商品ID映射到哈希环上。init_cache_node函数用于初始化缓存节点,find_nearest_node函数用于根据哈希值查找最近的缓存节点。在main函数中,我们模拟了3个缓存节点和一个商品查询请求,并演示了如何使用哈希环算法来路由请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式实战总结与Java程序员学习路线图

经过一系列的设计模式实战练习,从在线购物系统到旅行预订系统,本专栏已涵盖了多种常用设计模式的应用与实现。本文将对整个专栏进行总结,并为Java程序员提供一份学习路线图,帮助更好地规划未来的学习与职业发展方向。 一、设计模式学习总结 本专栏分为26篇文章,内容涵盖…

网络硬件升级指南:提升性能的策略与实践

随着企业对网络依赖程度的增加&#xff0c;网络性能的提升已成为信息技术部门的首要任务。本文将探讨如何通过升级网络硬件来提高网络性能&#xff0c;包括选择正确的硬件、实施升级策略和考虑未来网络的可扩展性。 一、网络性能的重要性 在数字化时代&#xff0c;网络是企业…

[BaseCTF 2024] 高校联合新生赛 Crypto (week1-7)

半个月没有落笔了。又到开学季&#xff0c;老油条们又在教新生了。题目很多&#xff0c;本想过于简单就不提交了&#xff0c;可以总是想起去年&#xff0c;到最后总是忘掉哪个作了哪个没作&#xff0c;也挺乱的。这回一共有7周呢&#xff0c;而且有的比赛题目居然不按周排序。 …

CART决策树-基尼指数(全网最详解)

文章目录 一、基尼指数的定义二、基尼指数在CART决策树中的应用三、基尼指数与CART决策树的构建1.计算每个子集的基尼系数&#xff1a;2.计算基尼指数3.选择最优特征4.其余基尼指数5.构建决策树 四、总结 CART决策树基尼指数是CART&#xff08;Classification And Regression T…

计算机网络参考模型

一、OSI七层参考模型&#xff08;ISO——国际标准化组织&#xff09; 应用层&#xff1a;为应用进程提供网络服务&#xff0c;例如你在qq输入几个字符表示层&#xff1a;数据的表示&#xff0c;安全&#xff0c;压缩&#xff08;把人的语言翻译成计算机能识别的语言&#xff09…

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解文件管理的相关知识&#xff0c;也就是常见的 读取&#xff0c;删除一类的操作 文件 为什么要使用文件&#xff1f; 程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术&#xff0c;但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上&#xff08;顶底&#xff09;分别配置为123456。汝等自管记好&#xff0c;今后自有妙用&#xff08;哈哈&#xff09;效果如图

AC 自动机查漏补缺

推荐在 cnblogs 上阅读 AC 自动机查漏补缺 前言 今年 1 月份学过一次&#xff0c;当时自以为掌握得很好&#xff0c;实际上就是依托答辩。而且还有很多地方是有严重误导性的。所以这篇查漏补缺就是记录一下自己对 AC 自动机尚不完全掌握的地方。并对之前的那篇不太正确的题解…

解决电脑突然断网没网,以太网无网络访问权限,本地连接时出错:地址仍未与网络终结点关联

帮同事处理网络问题&#xff0c;尝试了拔插网线&#xff0c;重启电脑&#xff0c;禁用启用以太网&#xff0c;都没有解决。 于是在**命令提示符(cmd)**中执行命令&#xff1a; ipconfig /release 按回车执行后&#xff0c;返回提示&#xff1a;本地连接时出错&#xff1a;地址…

什么是GD32 MCU读保护?

如今电子产品市场风云变幻&#xff0c;暗流汹涌&#xff0c;有没有小伙伴遇到自己费了大力气写出来的代码&#xff0c;很容易就被别人“借鉴”了&#xff0c;真的是让闻者伤心&#xff0c;听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢&#xff1f;答案当…

大众点评2024年6月全国全分类店铺基础信息数据库

大众点评的采集在2023年之前还是比较好采集的&#xff0c;很多接口不需要登录&#xff0c;即使登录一个帐号也可以采集很多&#xff0c;所以大约2023年8月以前的大众点评店铺字段非常丰富&#xff0c;几乎所有常见店铺字段都能采集。 2023年8月以后&#xff0c;大量接口权限变…

远程消息传递的艺术:NSDistantObject在Objective-C中的妙用

标题&#xff1a;远程消息传递的艺术&#xff1a;NSDistantObject在Objective-C中的妙用 引言 在Objective-C的丰富生态中&#xff0c;NSDistantObject扮演着至关重要的角色&#xff0c;特别是在处理分布式系统中的远程消息传递。它允许对象之间跨越不同地址空间进行通信&…

网安新声 | 网易云音乐崩了:网络安全如何守护在线体验

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 8月19日&#xff0c;#网易云音乐崩…

企业高性能web服务器【Nginx详解】

一.Web 服务基础介绍 1.1 互联网发展历程 1993年3月2日&#xff0c;中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通&#xff0c;成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站 中国黄页…

VAuditDemo安装漏洞

目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步&#xff1a;删除install.lock文件&#xff0c;访问 install.php 抓包 第二步&#xff1a;通过审计构造payload 第三步&#xff1a;修改抓包请求内容&#x…

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC&#xff0c;你或许会为它的小巧体型惊讶。然而&#xff0c;这看似不起眼的机身内&#xff0c;蕴藏着游戏、创意的强大能量。 掌中风暴&#xff0c;性能无界 ROG NUC搭载英特尔高性能处理器&#xff0c;配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…

“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“

目录 背景: 解决方法1: 解决方法2: 什么是驱动程序&#xff1a; 背景: 今天在日常的工作中&#xff0c; 我想将笔记本分屏到另一个显示屏&#xff0c;我这电脑Windows10系统&#xff0c;当我按下Windows键P键&#xff0c;屏幕信息上提示我"你的电脑不能投影到其他屏幕…

mybatis-plus使用saveOrUpdateBatch函数时数据库中已存在对应id数据,但报错插入时出现重复键

1. 问题背景 ProgramLang pl4 new ProgramLang(); // pl4.setId(100L).setLangName("YY").setDescription("Drama2");pl4.setId(100L);pl4.setLangName("YY");pl4.setDescription("Drama2");List<ProgramLang> updatedE…

调研在深度学习中如何读代码

这里调研了四个up主的内容&#xff0c;对他们讲的内容摘了一下主要的内容。想要看原文的画可以看原篇。 1.如何学习别人的代码&#xff08;代码量较大时&#xff09;_怎么学习别人的代码-CSDN博客 想要掌握的好&#xff0c;光阅读是不够的&#xff0c;一定要动手写、训练模型…