gpt4 book ai didi

ruby - String#hash 方法在 Ruby 中可以返回的最大值是多少?

转载 作者:数据小太阳 更新时间:2023-10-29 07:59:30 26 4
gpt4 key购买 nike

标题说明了一切,在 Ruby 中,'some random string'.hash 可以返回的最大值是多少?

docs不提供太多见解。

最佳答案

String#hash 可以输出的最大大小似乎是您环境中 unsigned long 的最大大小。

String#hash函数在rb_str_hash()中实现:

/* string.c, l. 2290 */

st_index_t
rb_str_hash(VALUE str)
{
int e = ENCODING_GET(str);
if (e && rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT) {
e = 0;
}
return rb_memhash((const void *)RSTRING_PTR(str), RSTRING_LEN(str)) ^ e;
}

st_index_t定义为 st_data_t 类型:

/* st.h, l. 48 */

typedef st_data_t st_index_t;

st_data_t是一个unsigned long:

/* st.h, l. 20 */

typedef unsigned long st_data_t;

由于散列是随机生成的(使用 SipHash ),unsigned long 中可能的整个值范围都应该可用。在 64 位环境中,unsigned long 当然是 64 位的。 SipHash 的输出是 64 位的,因此在 32 位环境中,Ruby 将其输出存储在一个包含两个 32 位无符号整数的数组中,rb_memhash() 将它们与按位 XOR 组合。

in siphash.h:

/* siphash.h, l. 14 */

#ifndef HAVE_UINT64_T
typedef struct {
uint32_t u32[2];
} sip_uint64_t;
#define uint64_t sip_uint64_t
#else
typedef uint64_t sip_uint64_t;
#endif

rb_memhash() :

/* random.c, l. 1306 */

st_index_t
rb_memhash(const void *ptr, long len)
{
sip_uint64_t h = sip_hash24(sipseed.key, ptr, len);
#ifdef HAVE_UINT64_T
return (st_index_t)h;
#else
return (st_index_t)(h.u32[0] ^ h.u32[1]);
#endif
}

这是 Ruby 的 sip_hash24() ,如果您想查看实现。

关于ruby - String#hash 方法在 Ruby 中可以返回的最大值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29303313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com