Ds\Hashable::hash

(PECL ds >= 1.0.0)

Ds\Hashable::hashRetorna um valor escalar a ser usado como valor de hash

Descrição

abstract public Ds\Hashable::hash(): mixed

Retorna um valor escalar a ser usado como valor de hash dos objetos.

Embora o valor de hash não defina igualdade, todos os objetos que são iguais de acordo com Ds\Hashable::equals() devem ter o mesmo valor de hash. Os valores de hash de objetos iguais não precisam ser exclusivos. Por exemplo, pode-se simplesmente retornar true para todos os objetos e nada quebraria - a única implicação seria que as tabelas de hash se transformariam em listas encadeadas porque todos os seus objetos seriam hashados para o mesmo bucket. Portanto, é muito importante escolher um bom valor de hash, como um ID ou endereço de e-mail.

Este método permite que objetos sejam usados como chaves em estruturas como Ds\Map e Ds\Set, ou qualquer outra estrutura de pesquisa que honre esta interface.

Caution

Não escolha um valor que possa mudar dentro do objeto, como uma propriedade pública. As consultas de tabela de hash falhariam porque o hash mudou.

Caution

Todos os objetos que são iguais devem ter o mesmo valor de hash.

Parâmetros

Esta função não possui parâmetros.

Valor Retornado

Um valor escalar a ser usado como valor de hash deste objeto.

Exemplos

Example #1 Ds\Hashable::hash() exemplo

<?php
class HashableObject implements \Ds\Hashable
{
    private $name;
    private $email;

    public function __construct($name, $email)
    {
        $this->name  = $name;
        $this->email = $email;
    }

    /**
     * Should return the same value for all equal objects, but doesn't have to
     * be unique. This value will not be used to determine equality.
     */
    public function hash()
    {
        return $this->email;
    }

    /**
     * This determines equality, usually during a hash table lookup to determine
     * if the bucket's key matches the lookup key. The hash has to be equal if
     * the objects are equal, otherwise this determination wouldn't be reached.
     */
    public function equals($obj): bool
    {
        return $this->name  === $obj->name
            && $this->email === $obj->email;
    }
}
?>