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');
			hash_update($ctx, (string)$object->name);
		}

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

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

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

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

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

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

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

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

		if (isset($object->options)) {
			hash_update($ctx, 'options');
			FieldOptionsMeta::hash($object->options, $ctx);
		}

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