字符串散列方法在Ruby中可以返回的最大值是多少?

字符串散列方法在Ruby中可以返回的最大值是多少?,ruby,Ruby,标题说明了一切,Ruby中的“某个随机字符串”散列可以返回的最大值是多少 该报告没有提供太多的见解。返回,其中: 保存可以在本机机器字(减1位)中表示的整数值 令人烦恼的是,似乎没有一种简单的方法来确定特定系统上的确切最大值(有一个),因此您目前必须自己计算它 下面的示例代码()可以在一些Ruby平台上工作,但不能在所有平台上都可靠地工作: FIXNUM_MAX = (2**(0.size * 8 -2) -1) FIXNUM_MIN = -(2**(0.size * 8 -2)) 可以输出的

标题说明了一切,Ruby中的“某个随机字符串”散列可以返回的最大值是多少

该报告没有提供太多的见解。

返回,其中:

保存可以在本机机器字(减1位)中表示的整数值

令人烦恼的是,似乎没有一种简单的方法来确定特定系统上的确切最大值(有一个),因此您目前必须自己计算它

下面的示例代码()可以在一些Ruby平台上工作,但不能在所有平台上都可靠地工作:

FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))

可以输出的最大大小
String#hash
似乎是环境中
无符号长字符串的最大大小

String#hash
函数在以下位置实现:

定义为类型
st\u data\t

/* st.h, l. 48 */

typedef st_data_t st_index_t;
是一个无符号长字符

/* st.h, l. 20 */

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

:


这是Ruby的,如果你想看看它的实现。

我认为这取决于Ruby的实现。在正常使用Ruby的情况下,您不需要知道这一点。你为什么要知道?可能是重复的。我仍然不明白为什么这不是Ruby的一部分。此外,您的代码不可移植,因为其他Ruby实现可能具有不同的最大值和最小值。原来的帖子也没有提到这一点。@cremno:是的,我很惊讶它没有内置。但是在示例代码中使用
0.size
(using)不是使其在解释器之间可移植吗?使其不可移植的不是
Fixnum#size
。它是
减去1位(实际上)。参见Charles Nutter(JRuby)的评论。
/* st.h, l. 20 */

typedef unsigned long st_data_t;
/* 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
/* 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
}