blob: 64cad472704830ed7c5ac74e3ce58c1375a7b035 [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library yaml.utils;
import 'package:collection/collection.dart';
/// Returns a hash code for [obj] such that structurally equivalent objects
/// will have the same hash code.
///
/// This supports deep equality for maps and lists, including those with
/// self-referential structures.
int hashCodeFor(obj) {
var parents = [];
_hashCodeFor(value) {
if (parents.any((parent) => identical(parent, value))) return -1;
parents.add(value);
try {
if (value is Map) {
return _hashCodeFor(value.keys) ^ _hashCodeFor(value.values);
} else if (value is Iterable) {
return const IterableEquality().hash(value.map(hashCodeFor));
}
return value.hashCode;
} finally {
parents.removeLast();
}
}
return _hashCodeFor(obj);
}