在Nim行动第114页上定义自定义哈希函数的示例中,!$
操作符用于“最后确定计算的散列”。
import tables, hashes
type
Dog = object
name: string
proc hash(x: Dog): Hash =
result = x.name.hash
result = !$result
var dogOwners = initTable[Dog, string]()
dogOwners[Dog(name: "Charlie")] = "John"
在以下段落中:
!$
运算符完成计算的哈希,这在编写自定义hash
过程时是必要的。使用$!
运算符确保计算的散列是唯一的。
我很难理解这一点。“定案”是什么意思?在这种情况下,确保某些东西是独一无二的意味着什么?
发布于 2018-01-10 04:45:24
如果您不是阅读!$
操作符的单一描述,而是查看哈希模块文档的开始,那么您的问题可能会得到解答。正如您可以看到的,原始数据类型有一个hash()
proc,它返回自己的散列。但是,如果您有一个包含许多变量的复杂对象,您可能希望为对象本身创建一个散列,您如何做到这一点?在不使用散列理论的情况下,并将散列处理为黑匣子,您需要使用两种proc来生成有效的散列:加法/级联算子和终结运算符。因此,您最终使用!&
将单个散列添加(或混合)到一个时态值中,然后使用!$
将该时态值确定为最终散列。如果Dog对象有一个以上的变量,则Nim in Action示例可能更容易理解,因此需要同时使用两个操作符:
import tables, hashes, sequtils
type
Dog = object
name: string
age: int
proc hash(x: Dog): Hash =
result = x.name.hash !& x.age.hash
result = !$result
var dogOwners = initTable[Dog, string]()
dogOwners[Dog(name: "Charlie", age: 2)] = "John"
dogOwners[Dog(name: "Charlie", age: 5)] = "Martha"
echo toSeq(dogOwners.keys)
for key, value in dogOwners:
echo "Key ", key.hash, " for ", key, " points at ", value
至于为什么散列值暂时连接起来,然后最后确定,这在很大程度上取决于哪些算法让Nim开发人员选择用于散列。您可以看到从源代码,哈希连接和终结主要是位移位。不幸的是,源代码没有解释或指向任何其他引用来理解为什么要这样做,以及为什么要选择这种特定的散列算法。您可以尝试向Nim论坛询问这一点,并可能通过您的发现来改进文档/源代码。
https://stackoverflow.com/questions/48187132
复制相似问题