02.09.2013, 19:39
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:
If I'm use hash in that case:
Console returns that:
But if I change "ABCCCC" on "A"" in:
Console return:
Shortly - I want to change type of hash - length is always same (64 chars), but hash change even, when one letter was changed.
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;
}
pawn Код:
main() {
new str_[95] = "ABCCCC", res_[95];
enc(str_, res_);
printf("Base8192:\n%s", res_);
return false;
}
Код:
Base8192: E6gDA77E664641
pawn Код:
main() {
new str_[95] = "A", res_[95];
enc(str_, res_);
printf("Base8192:\n%s", res_);
return false;
}
Код:
Base8192: E664641