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

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

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

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

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

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

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

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

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