gpt4 book ai didi

nim-lang - Nim 中的 !$(bang dollar)运算符是什么?

转载 作者:行者123 更新时间:2023-12-04 03:02:15 25 4
gpt4 key购买 nike

Nim in Action 的第 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"

在下面的段落中:

The !$ operator finalizes the computed hash, which is necessary when writing a custom hash procedure. The use of the $! operator ensures that the computed hash is unique.

我无法理解这一点。 “完成”某事是什么意思?在这种情况下确保某物是独一无二的意味着什么?

最佳答案

如果不阅读 !$ 运算符的单一描述,而是看一下 beginning of the hashes module documentation,您的问题可能会得到解答。 .如您所见,原始数据类型有一个 hash() 过程,它返回它们自己的散列。但是如果你有一个包含很多变量的复杂对象,你可能想为对象本身创建一个散列,你该怎么做呢?无需深入研究哈希理论,也无需将哈希视为黑盒,您需要使用两种过程来生成有效的哈希:addition/concatenation operator。和 finalization operator .因此,您最终使用 !& 将各个散列添加(或混合)到一个时间值中,然后使用 !$最终确定时间值转换为最终哈希。如果 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 开发人员选择使用哪种算法进行哈希。可以看到from the source code哈希连接和最终确定主要是位移。不幸的是,源代码没有解释或指出任何其他引用来理解为什么这样做以及为什么选择这种特定的哈希算法而不是其他算法。您可以尝试询问 Nim forums为此,也许可以根据您的发现改进文档/源代码。

关于nim-lang - Nim 中的 !$(bang dollar)运算符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187132/

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