Как я могу получить sha1 всего реф в Clojure? - PullRequest
1 голос
/ 12 апреля 2011

Я хотел бы сравнить две копии частей ссылки, чтобы увидеть, изменились ли они.Как я могу получить sha1 карты и любые вспомогательные листья?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

В зависимости от того, что именно вы хотите сделать, вы можете обнаружить, что просто использование обычного Java hashCode () с помощью функции "hash" проще, чем попытка использовать SHA:

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

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

В большинстве случаев этого достаточно, чтобы определить, отличаются ли две карты.

Обратите внимание, что ни SHA, ни любой другой хэш-код не гарантируют равенство, когда два объекта имеют одинаковый хэш - многие объекты могут потенциально иметь одинаковый хэш. Как следствие, если хеш-код одинаков, вам все равно придется проверить, равны ли два объекта по значению

Также помните, что вычислительные хэши * на 1008 * дороже , чем простое сравнение с использованием =. Поэтому имеет смысл использовать технику хэширования, только если вы можете сохранить значение хэша и использовать его повторно для многих сравнений.

1 голос
/ 13 апреля 2011

Вы уверены, что действительно хотите что-то более низкого уровня, чем это?Идентичность в clojure, по крайней мере, по отношению к значениям, встроена:

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