写一段Hash函数实例
时间: 2024-06-11 16:07:45 浏览: 70
下面是一个简单的Hash函数实例:
```python
def hash_func(key):
# 将字符串转换成整数
hash_value = 0
for char in key:
hash_value += ord(char)
# 取余数作为Hash值
hash_value = hash_value % 10
return hash_value
```
这个Hash函数的实现比较简单,它的思路是将字符串中每个字符的ASCII码值相加,然后取余数作为Hash值。这个Hash函数的Hash表大小为10,因此返回值的范围是0-9。当我们想要将一个字符串插入到Hash表中时,可以使用这个Hash函数计算出它的Hash值,并将其插入到对应的位置。如果发生冲突,可以使用开放地址法或者链表法来解决。
相关问题
帮我写一段rocketmq的生产者代码,根据雪花算法生成订单ID,根据队列数量hash到不同的队列上,然后往下游的TOPIC发
当然可以,首先我们需要了解雪花算法(Snowflake)生成的是一个64位的数字,通常会被拆分成时间戳、序列号和机器标识三部分。下面是一个简单的RocketMQ Java生产者的示例,它会按照这个逻辑生成订单ID,并根据队列的数量进行哈希分发:
```java
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.Message;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.MessageQueue;
import java.util.concurrent.atomic.AtomicLong;
public class RocketMQProducer {
private static final String BROKER_URL = "localhost:9876"; // RocketMQ Broker地址
private static final int QUEUE_NUM = 5; // 队列数量
private static final String TOPIC = "OrderTopic";
private static DefaultMQProducer producer = new DefaultMQProducer("your-producer-group"); // 创建Producer实例并设置组名
// 雪花算法生成订单ID
private static AtomicLong snowflakeIdGenerator = new AtomicLong(0);
public static void main(String[] args) {
try {
// 初始化连接
producer.start();
for (int i = 0; i < 10; i++) { // 发送消息次数
long orderId = generateOrderId(); // 生成订单ID
Message msg = new Message(TOPIC, Long.toString(orderId), "", Serializables.DEFAULT); // 构造Message
// 根据订单ID哈希到指定队列
int queueIndex = getQueueIndex(orderId);
MessageQueue mq = new MessageQueue(TOPIC, queueIndex);
SendResult sendResult = producer.send(mq, msg);
System.out.printf("Send message %d to topic %s, result: %s%n", orderId, TOPIC, sendResult);
}
// 关闭连接
producer.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
// 雪花算法生成订单ID
private static long generateOrderId() {
return snowflakeIdGenerator.getAndIncrement();
}
// 订单ID哈希到指定队列
private static int getQueueIndex(long orderId) {
// 这里只是一个简单示例,实际应用可能会采用更复杂的哈希函数和模运算
return Math.abs((int) (orderId % QUEUE_NUM));
}
}
```
注意,你需要将`BROKER_URL`替换为你的RocketMQ服务器的实际地址,同时记得将`"your-producer-group"`替换为你想要使用的生产者组名。
写一段代码为商品目录散列表
这是一个简单的示例,使用C++来创建一个基于字符串的简易商品目录散列表。这里假设我们使用哈希表(std::unordered_map)来实现:
```cpp
#include <iostream>
#include <fstream>
#include <string>
#include <unordered_map>
// 使用哈希函数(这里简化用名字作为key)
struct HashFunction {
std::string hash(const std::string& barcode) {
return barcode;
}
};
// 商品结构体
struct Product {
std::string name;
std::string unit;
double price;
// 构造函数和获取信息的成员函数省略...
};
class ProductCatalog {
private:
std::unordered_map<std::string, Product> catalog; // 商品目录
std::ifstream file; // 文件流
public:
void load_from_file(const std::string& filename) {
if (file.open(filename)) {
std::string line;
while (std::getline(file, line)) {
size_t pos = line.find(",");
if (pos != std::string::npos) {
std::string barcode = line.substr(0, pos);
Product product;
// 解析并填充product实例
// ...
catalog[barcode] = product;
}
}
file.close();
} else {
std::cerr << "Failed to open file: " << filename << std::endl;
}
}
void add_product(const Product& product) {
catalog[HashFunction().hash(product.barcode)] = product;
}
void remove_product(const std::string& barcode) {
catalog.erase(HashFunction().hash(barcode));
}
Product search_by_barcode(const std::string& barcode) const {
auto it = catalog.find(HashFunction().hash(barcode));
if (it != catalog.end()) {
return it->second;
}
return Product(); // 返回默认产品,表示未找到
}
};
int main() {
ProductCatalog catalog;
catalog.load_from_file("products.txt");
Product new_product = { /* 新商品信息 */ };
catalog.add_product(new_product);
Product searched_product = catalog.search_by_barcode("商品ID");
if (!searched_product.name.empty()) {
std::cout << "Name: " << searched_product.name << ", Unit: " << searched_product.unit << ", Price: " << searched_product.price << std::endl;
} else {
std::cout << "Product not found." << std::endl;
}
// 删除操作省略...
return 0;
}
```
这个代码首先读取外部文件中的商品信息,然后允许添加、搜索和删除商品。注意,实际项目中需要更复杂的解析逻辑来处理文件中的实际数据格式。
阅读全文