c_rehash

用途

  c_rehash - 为文件创建一个符号连接,并将此符号连接的名称设为文件的hash值。

用法

  c_rehash [-old] [-h] [-n] [-v] [ directory... ]

描述

  c_rehash扫描指定目录列表中的.pem,.crt,.cer及.crl文件并为这些文件计算hash值,并以计算出的hash值为名字为这些文件创建符号连接。(如果你的操作平台不支持符号连接,则执行的是一个拷贝。)这个功能像很多程序一样有用,对于使用OpenSSL要求建立的目录,其目的是找到证书。

  如果命令行中指定了目录名,则依次处理它们。如果命令行中没有指定目录名,那么会去询问SSL_CERT_DIR环境变量,此变量应该像Unix PATH变量一样,以冒号作为分隔,存放目录列表。如果环境变量中未指定目录,则默认的目录由安装时的信息指定,通常是:/usr/local/ssl/certs。

  想要一个目录被处理,用户必须对该目录具有可写权限,否则会跳过。创建的连接是HHHHHHHH.D格式,每一个H是一个十六进制的字符,D是一个单一的十进制数字。当处理一个目录时,c_rehash会先将所有符合这种格式的连接移除掉。如果你有一些像这种格式但用于其它目的的连接文件,他们也都将被移除掉。想要跳过移除步骤,可以使用-n标记。当hash CRL时,会额外附加一个r,像下面这样:HHHHHHHH.rD。

  多个对象可能有相同的hash,此时会通过D的值来区分。如果发现有重复的,会比较它们完整的SHA-1特征指纹。如果发现一个重复的,将会显示警告信息。

  如果有文件不能被作为一个证书或CRL进行检查,那么也会显示一个警告信息。

  程序使用了openssl程序去计算hash和特征指纹。如果未找到用户的目录,则设置OPENSSL环境变量为完整的路径名。可使用任何程序,它将调用如下的证书或CRL:

    $OPENSSL x509 -hash -fingerprint -noout -in FILENAME

    $OPENSSL crl -hash -fingerprint -noout -in FILENAME

   FILENAME是一个文件名。它必须在第一行输出文件的hash值,在第二行输出特征指纹,选择性的含有一些文本或等号前缀。

选项

-old

  使用1.0.0版本之前的老式hash(MD5,而不是SHA-1)去生成连接。注意,当前的版本(1.0.2)不会使用老式的hash。

-h

  显示一个简短的使用信息。

-n

  不要移除已经存在的连接。当要同时保留新的和老式的连接时需要此选项。

-v

  打印移除的老式连接和新创建的连接的信息。默认c_rehash只会列出被处理目录的相关信息。

环境变量

OPENSSL

  一个可执行的路径,用于生成hash和特征指纹(查看上面的内容)。

SSL_CERT_DIR

  以冒号分隔的,将用于操作的目录列表。如果目录已经被列出在命令行中了,则忽略此变量。

以下是一个使用线性探测法处理冲突的散列表的 C 代码示例: ```c #include <stdio.h> #include <stdlib.h> #define SIZE 10 struct node { int key; int value; }; struct hash_table { struct node *data[SIZE]; }; int hash_function(int key) { return key % SIZE; } int rehash(int old_hash) { return (old_hash + 1) % SIZE; } void put(struct hash_table *table, int key, int value) { int hash_value = hash_function(key); struct node *node = (struct node *) malloc(sizeof(struct node)); node->key = key; node->value = value; while (table->data[hash_value] != NULL && table->data[hash_value]->key != key) { hash_value = rehash(hash_value); } table->data[hash_value] = node; } int get(struct hash_table *table, int key) { int start_hash = hash_function(key); int hash_value = start_hash; int value = -1; while (table->data[hash_value] != NULL) { if (table->data[hash_value]->key == key) { value = table->data[hash_value]->value; break; } hash_value = rehash(hash_value); if (hash_value == start_hash) { break; } } return value; } int main() { struct hash_table table; for (int i = 0; i < SIZE; i++) { table.data[i] = NULL; } put(&table, 1, 10); put(&table, 2, 20); put(&table, 3, 30); printf("%d\n", get(&table, 1)); printf("%d\n", get(&table, 2)); printf("%d\n", get(&table, 3)); printf("%d\n", get(&table, 4)); return 0; } ``` 这个散列表使用取余法计算哈希值,并且使用线性探测法来解决冲突。在 `put` 函数中,如果发生冲突,就不断向后查找下一个空位置,直到找到一个空位置或者查找完整个散列表。在 `get` 函数中,先计算出哈希值,然后依次向后查找,直到找到目标元素或者查找完整个散列表。注意,我们在每次 `put` 操作时都需要动态分配一个新的节点,以便保存键值对信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值