如何在 Clojure 中获取整个引用的 sha1?

发布于 10-31 20:03 字数 50 浏览 2 评论 0原文

我想比较参考部分的两个副本,看看它们是否已更改。我如何获得地图和任何子叶的 sha1?

I would like to compare two copies of parts of a ref to see if they have changed. How can I get a sha1 of a map and any sub leaves?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

廻憶裏菂餘溫2024-11-07 20:03:58

根据您想要执行的具体操作,您可能会发现仅通过“散列”函数使用普通 Java hashCode() 比尝试使用 SHA 更简单:

(hash {:a "hoho" :b "hehe"})
=> 2025831869

(hash {:a "hoho" :b "hihi"})
=> 2025836181

在大多数情况下,这足以确定两个映射是否不同。

请注意,当两个对象具有相同的哈希值时,SHA 或任何其他哈希码都不能保证相等 - 许多对象可能具有相同的哈希值。因此,如果哈希值相同,您仍然需要检查两个对象的值是否相等。

此外,请注意计算哈希值比使用 = 进行简单比较更昂贵。因此,只有当您能够存储哈希值并重新使用它进行多次比较时,使用哈希技术才有意义。

Depending on exactly what you want to do, you may find just using the normal Java hashCode() via the "hash" function is simpler than trying to use SHA:

(hash {:a "hoho" :b "hehe"})
=> 2025831869

(hash {:a "hoho" :b "hihi"})
=> 2025836181

This is enough in most cases to determine if two maps are different.

Note that neither SHA or any other hashcode guarantee equality when two objects have the same hash - many objects can potentially have the same hash. As a consequence, if the hash is the same you will still have to check whether the two objects are equal in value

Also, be aware that computing hashes is more expensive than a simple comparison using =. So it only makes sense to use a hashing technique if you are able to store the hash value and re-use it for many comparisons.

时光沙漏2024-11-07 20:03:58

你确定你真的想要这样低级的东西吗? clojure 中的身份,至少是关于值,是内置的:

user> (= {:a 1, :b {:c 2}} (hash-map :b {:c 2} :a 1))
true

are you sure you actually want something as low-level as that? Identity in clojure, at least wrt values, is kinda built in:

user> (= {:a 1, :b {:c 2}} (hash-map :b {:c 2} :a 1))
true
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文