• [^] # Re: Hash ?

    Posté par . En réponse au message Equivalent en Perl de Hashcode en Java. Évalué à 3.

    Ben suffit de rajouter un test dans la boucle, et retrancher MIN+MAX pour repartir du MIN :


    my $MAX_VALUE = Math::BigInt->new("9223372036854775808");

    foreach(split //,shift) {

    $hash = 31*$hash+ord($_);

    if ($hash >= $MAX_VALUE) {
    $hash = $hash - 2*MAX_VALUE;
    }
    }


    En fait Java doit coder les longs sur 64bits, dont un bit de signe. Quand il dépasse 2^63-1, la retenue tombe sur le bit de signe, et on repart à -2^63. Classique des langages de soit-disant haut niveau, qui devraient être indépendants des détails d'implémentations, mais qui gère mal (cad pas du tout) ce genre de cas...