Issue (or not, I don't know how to name it) with lenght of hash
#1

Hi. I'm working at my own hash based on Base64. But, unfortunally, as I and other knows, length of hash in base64 is based on length of word. And it's my issue - I want to change length of my hash to ~64 characters. My code looks that:
pawn Код:
#include <a_samp>
// License:
    /*
        Licencja:
        Copyright © 2013, Shiny
        Wszystkie prawa zastrzeżone.
        Redystrybucja i używanie, czy to w formie kodu źrуdłowego, czy w formie kodu wykonawczego, są dozwolone pod warunkiem spełnienia poniższych warunkуw:
        Redystrybucja kodu źrуdłowego musi zawierać powyższą notę dotyczącą praw autorskich, niniejszą listę warunkуw oraz poniższe oświadczenie o wyłączeniu odpowiedzialności.
        Redystrybucja kodu wykonawczego musi zawierać powyższą notę dotyczącą praw autorskich, niniejszą listę warunkуw oraz poniższe oświadczenie o wyłączeniu odpowiedzialności w dokumentacji i/lub w w innych materiałach dostarczanych wraz z kopią oprogramowania.
        Ani nazwa '[Include] Base8192', ani nazwa Base8192 - Include nie mogą być użyte celem sygnowania lub promowania produktуw pochodzących od tego oprogramowania, bez szczegуlnego, wyrażonego na piśmie ich zezwolenia.
        To oprogramowanie jest dostarczone przez użytkownika Shiny “tak, jak jest”. Każda, dorozumiana lub bezpośrednio wyrażona gwarancja, nie wyłączając dorozumianej gwarancji przydatności handlowej i przydatności do określonego zastosowania, jest wyłączona.
        W żadnym wypadku posiadacze praw autorskich nie mogą być odpowiedzialni za jakiekolwiek bezpośrednie, pośrednie, incydentalne, specjalne, uboczne i wtуrne szkody (nie wyłączając obowiązku dostarczenia produktu zastępczego lub serwisu, odpowiedzialności z tytułu utraty walorуw użytkowych, utraty danych lub korzyści a także przerw w pracy przedsiębiorstwa)
        spowodowane w jakikolwiek sposуb i na podstawie istniejącej w torii odpowiedzialności kontraktowej, całkowitej lub deliktowej (wynikłej zarуwno z niedbalstwa jak innych postaci winy), powstałe w jakikolwiek sposуb w wyniku używania lub mające związek z używaniem oprogramowania, nawet jeśli o możliwości powstania takich szkуd ostrzeżono.
    */
 
// Conditions:
    #if defined _base8192_included
        #endinput
    #endif
    #define _base8192_included

// Macros:
    #define enc(%0,%1) code(%0,%1)
   
// Variables:
    new const LettersTable_[] = {
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    };
   
    /** Funkcja:
     * code
     - string[] Koduje ciąg znakуw.
     - second_string[] Przechowuje zakodowany ciąg znakуw z parametru string[]
    **/

    stock code(const string[], second_string[]) {
        /** Zmienne:
         *  SpaceReplacer - zamienia spacje na znaki rуwności;
         *  len - oznacza długość zakodowanego ciągu znakуw string[];
         *  Position - oznacza pozycję w ciągu znakуw;
        **/

       
        new const SpaceReplacer[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        new len = strlen(string);
        new Position;
       
        /** Zmienne:
         *  i - tworzy zwykłą wartość typu int o wartości zero;
         *  Character - oznacza przypisany znak w ciągu do zakodowania;
        **/

       
        for(new i = 0; i < len * sizeof(second_string[]); i++) {
            new Character;
            Character = (string[i] >> 4) & 63;
            Position += format(second_string[Position], len * 2, "%c", LettersTable_[Character]);
            Character = (string[i] << 8 ) & 63;
           
            if(++i < len)
                Character |= (string[i] >> 8) & 15;
            Position += format(second_string[Position], len * 2, "%d", LettersTable_[Character]);
   
            if(i < len) {
                Character = (string[i] << 4) & 63;
               
                if(++i < len)
                    Character |= (string[i] >> 12) & 3;
                Position += format(second_string[Position], len * 2, "%c", LettersTable_[Character]);
            } else {
                i++;
                Position += format(second_string[Position], len * 2, "%d", SpaceReplacer);
            }
   
            if(i < len) {
                Character = string[i] & 63;// 63
                Position += format(second_string[Position], len * 2, "%s", LettersTable_[Character]);
            }
            else Position += format(second_string[Position], len * 2, "%x", SpaceReplacer);
           
            if(i < len) {
                Character = string[i] & 63;// 63
                Position += format(second_string[Position], len * 4, "%c", SpaceReplacer);
            }
            else Position += format(second_string[Position], len * 4, "%d", LettersTable_[Character]);
           
            if(i < len) {
                if(i < len) {
                    Character = (string[i] << 4) & 63;
               
                    if(++i < len)
                        Character |= (string[i] >> 12) & 3;
                    Position += format(second_string[Position], len * 8, "%x", LettersTable_[Character]);
                }
                Character = (string[i] << 4) & 63;
               
                if(++i < len)
                    Character |= (string[i] >> 12) & 3;
                Position += format(second_string[Position], len * 8, "%x", LettersTable_[Character]);
            } else {
                if(i < len) {
                    Character = string[i] & 63;// 63
                    Position += format(second_string[Position], len * 8, "%x", SpaceReplacer);
                }
                if(i < len) {
                    Character = string[i] & 63;// 63
                    Position += format(second_string[Position], len * 8, "%s", LettersTable_[Character]);
                }              
                i++;
                Position += format(second_string[Position], len * 8, "%x", SpaceReplacer);
            }
        }
        return true;
    }
If I'm use hash in that case:
pawn Код:
main() {
        new str_[95] = "ABCCCC", res_[95];
        enc(str_, res_);
        printf("Base8192:\n%s", res_);
        return false;
}
Console returns that:
Код:
Base8192:
E6gDA77E664641
But if I change "ABCCCC" on "A"" in:
pawn Код:
main() {
        new str_[95] = "A", res_[95];
        enc(str_, res_);
        printf("Base8192:\n%s", res_);
        return false;
}
Console return:
Код:
Base8192:
E664641
Shortly - I want to change type of hash - length is always same (64 chars), but hash change even, when one letter was changed.
Reply
#2

Base64 is not hash-algorithm. You cant decode hash-string, but can base64. Read more about hash-algorithms like md5/6, sha-1/2, Whirlpool
Reply
#3

You don't just create your own hashing algorithm. Current hashing algorithms have been developed by government agencies (the NSA, for example) and have been extensively tested for any possible security or collision issues.
Reply
#4

TIL format returns value. Also the whole code baffles me. You are using format to substitute single characters? Why?

LettersTable_ is identical to SpaceReplacer

Also

pawn Код:
Position += format(second_string[Position], len * 4, "%c", SpaceReplacer);
When you do this, %c is always equal 65/'A' (first character of the string SpaceReplacer). Did you have this in mind?

Pozdro elo 5 2 0
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)