c - 计算 C Union 的哈希码的有效方法是什么?

标签 c hash hashmap hashtable

对于下面给定的 C UNION,计算它的哈希码的有效方法是什么?我应该使用内存中的原始二进制数据吗?还是我应该尝试解释 UNION 的内容来计算哈希码?

#ifdef AF_INET6

#define SOCKADDR        union { \
                            struct sockaddr_in him4; \
                            struct sockaddr_in6 him6; \
                        }

#define SOCKADDR_LEN    (ipv6_available() ? sizeof(SOCKADDR) : \
                         sizeof(struct sockaddr_in))

#else

#define SOCKADDR        union { struct sockaddr_in him4; }
#define SOCKADDR_LEN    sizeof(SOCKADDR)

#endif

我尝试将其转换为 (struct sockaddr_in *) 并使用 sa_in->sin_addr.s_addrsa_in->sin_port .但这感觉不对。我完全忽略了 struct sockaddr_in6。我应该只使用原始内存数据吗?怎么办?


struct sockaddr_in6 {
               sa_family_t     sin6_family;   /* AF_INET6 */
               in_port_t       sin6_port;     /* port number */
               uint32_t        sin6_flowinfo; /* IPv6 flow information */
               struct in6_addr sin6_addr;     /* IPv6 address */
               uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */
           };

           struct in6_addr {
               unsigned char   s6_addr[16];   /* IPv6 address */
           };

struct sockaddr_in{  
    short sin_family;  
    unsigned short sin_port;  
struct in_addr sin_addr;  
    char sin_zero[8];  
};  

最佳答案

您必须解释 union 的实际内容,至少在一般情况下。原因很简单,零件可能未被使用,即不会对 union 的有效值(value)做出贡献。例如,一个结构可能在成员之间有填充以对齐成员。对于 union ,当不同的 union 成员有不同的大小时,你可以很容易地在最后填充。如果您忽略这一点,那么对于所有实际用途而言都相等的 union 将具有不同的哈希值。

关于c - 计算 C Union 的哈希码的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245509/

相关文章:

c - pthread_create空间不足

c++ - 在 C++ 中放松 void * 转换

iphone - 在 iOS 设备上本地保存游戏分数...需要安全吗?

perl - 使用 perl 脚本编辑帮助以在数组中的特定位置开始和停止

java - 如何将两个映射合并为一个并保留重复值

c++ - 高阶位——把它们变成 uint64_t 变成 uint8_t

c - 如何快速读取和解析带有数字的文本文件(在 C 中)?

hash - Visual Basic 6.0 哈希函数

perl - 我正在尝试为 perl 中的错误消息的占位符创建一个模板。有什么建议么?

java - 解析 HashMap 中的字符串数组