 // Miscellanea: -
 
 /// Generates a hash value for one or more hashable values.
-private func hash<H: Hashable>(_ hashables: H...) -> Int {
+public func hash<H: Hashable>(_ hashables: H...) -> Int {
     // djb2 hash algorithm: http://www.cse.yorku.ca/~oz/hash.html
     // &+ operator handles Int overflow
     return hashables.reduce(5381) { (result, hashable) in ((result << 5) &+ result) &+ hashable.hashValue }

         - parameter: A parameter to pass to the resolution block.
         - cached: Whether to use the cached value or to call the resolution block again.
     
;     - note: Passing `nil` for the `cached` parameter causes Guise to use the value of `cached` recorded
     when the dependency was registered. In most cases, this is what you want.
    */

        }
    }
    
    /// The root filter method. All filters and existence checks ultimately end up here.
    private static func filter<K: Keyed & Hashable>(type: String?, name: AnyHashable?, container: AnyHashable?, metathunk: Metathunk? = nil) -> Set<K> {
        // Key matching is performed inside the lock (of course).
        let filtered: [K: Dependency] = lock.read {
            var filtered = Dictionary<K, Dependency>()
            for (key, dependency) in registrations {
                /*
                 Even if `type` is nil, `K` can still filter
                 by type if it is `Key<T>.
                 */
                guard let key = K(key) else { continue }
                if let type = type, type != key.type { continue }
                if let name = name, name != key.name { continue }
