public static function hash($object, $algoOrCtx = 'md5', $raw = FALSE)
	{
		if (is_string($algoOrCtx)) {
			$ctx = hash_init($algoOrCtx);
		} else {
			$ctx = $algoOrCtx;
		}

		if (isset($object->name)) {
			hash_update($ctx, 'name');
			foreach ($object->name instanceof \Traversable ? $object->name : (array)$object->name as $v0) {
				NamePartMeta::hash($v0, $ctx);
			}
		}

		if (isset($object->identifierValue)) {
			hash_update($ctx, 'identifierValue');
			hash_update($ctx, (string)$object->identifierValue);
		}

		if (isset($object->positiveIntValue)) {
			hash_update($ctx, 'positiveIntValue');
			hash_update($ctx, (string)$object->positiveIntValue);
		}

		if (isset($object->negativeIntValue)) {
			hash_update($ctx, 'negativeIntValue');
			hash_update($ctx, (string)$object->negativeIntValue);
		}

		if (isset($object->doubleValue)) {
			hash_update($ctx, 'doubleValue');
			hash_update($ctx, (string)$object->doubleValue);
		}

		if (isset($object->stringValue)) {
			hash_update($ctx, 'stringValue');
			hash_update($ctx, (string)$object->stringValue);
		}

		if (isset($object->aggregateValue)) {
			hash_update($ctx, 'aggregateValue');
			hash_update($ctx, (string)$object->aggregateValue);
		}

		if (is_string($algoOrCtx)) {
			return hash_final($ctx, $raw);
		} else {
			return null;
		}
	}