在OCaml中,Hashtbl
可以hash
任何东西到int
Hashtbl.hash x将非负整数与任何类型的任何值相关联。保证如果x = y或Pervasives.compare x y = 0,则hash x = hash y。而且,哈希总是终止,即使在循环结构上也是如此。
我的意思是,在Java
中,对于返回整数的每个对象,我们都有hashCode()
,而Java的Hashtable可以散列该整数。
但OCaml是如何实现这一点的呢?
答案 0 :(得分:6)
这并不棘手。 Hashtbl.hash
只是以类似于垃圾收集器的方式遍历数据。它以固定的距离进入链接结构,避免了在有周期时失败。它对它遇到的高级类型一无所知,它只是散列它所达到的原始值。
您可以在OCaml源代码分发中看到byterun / hash.c中的代码。
<强>更新强>
我可能一直在询问如何在OCaml 中实现Hashtbl.hash
。答案是它无法在OCaml中实现(没有作弊),因为它违反了参数。类型'a -> int
唯一可能的纯函数是返回常量值的函数。直觉是这样的函数不能使用有关其参数的任何信息,因为它是为所有可能的类型定义的。
Hashtbl.hash
是一些违反参数的OCaml函数之一。它们存在于OCaml中,因为它们非常方便。另一个臭名昭着的是多态比较compare
(以及相关的=
运算符)。