|
TwojePC.pl © 2001 - 2025
|
 |
A R C H I W A L N A W I A D O M O Ś Ć |
 |
| |
|
[programowanie] Konwersja liczb między różnymi pozycyjnymi systemami liczbowymi , kubazzz 9/08/10 02:25 Kiedyś dawno pytałem jak zrobić takie ładne unikalne kody jak na youtube na przykład.
Jedyną sugestią, której zresztą się wcześniej trzymałem, było robienie hash'a i ucinanie go [żeby nie miał miliard znaków].
Ale to taka prowizorka i nie do końca spełnia swoje zadanie bo wykorzystane do zapisu jest tylko 16 różnych znaków, hashe są długie, a ucięte do 8-10 pierwszych znaków, przynajmniej w teorii dają namacalne ryzyko kolizji. Oczywiście miałem na to rozwiązanie, ale wrażenie prowizorki pozostawało.
Od dość dawna świtał mi pomysł, żeby to zrobić inaczej:
hash z funkcji whirlpool daje 128 liczb szesnastkowych co przekłada się na 16 znaków ASCII.
Ja chciałbym do skrótów wykorzystać wszystkie małe i duże litery oraz 10 cyfr, a to daje w sumie 26+26+10=62 znaki.
Czyli możnaby stworzyć pozycyjny system liczbowy oparty o liczbę 62, z 62 "cyframi".
W ten sposób udałoby się mocno skrócić zapis oparty na tylko 16 cyfrach, a nawet jesli wciąż byłby za długi to po obcięciu zostawałaby znacznie większa część oryginalnego hasha zmniejszając istotnie ryzyko kolizji.
Wszystko byłoby pięknie, gdyby nie fakt, że nie potrafię napisać w PHP skryptu, który by to przeliczał.
Sama zasada jak wiadomo jest prosta, dzieli się z resztą i odpisuje na kolejne pozycje, ale zabawa zaczyna się z typami danych, definicją zakresu "cyfr" własnego systemu pozycyjnego.
Jest to też taka "late night idea" i pewnie długo będę to kminił, ale może jakaś dobra dusza naprowadzi ciut bliżej.
[założę się, że istnieje gdzieś gotowiec na tworzenie takich ładnych skrótów, kiedyś szukałem i nie znalazłem, a odkąd wymyśliłem swoje rozwiązanie to jakoś nie chcę sprawdzać:P ]SM-S908 - Eeee straszna kombinacja... Masz funkcję mikrotime którą możesz , Mcmumin 9/08/10 10:07
zrandomować, przepuścić przez MD5, SHA włorewer- ale cala idea nie jest na tym CO przepuszcze , kubazzz 9/08/10 13:12
tylko jaki bedzie tego wynik:)
md5, SHA dadzą mi ciąg znaków oparty o 16 tylko symboli, więc na coś takiego jak
ABFu76rT nie mam szans;)SM-S908 - ... , Vertus 9/08/10 14:03
robilbym tak jak robisz. Generowal md5 z czegos losowego, wycinal do żadanej ilosci znakow poczym sprawdzal w bazie czy jest, jak jest to ponawiam.- do tej pory , kubazzz 9/08/10 15:07
cały czas to wygląda i działa
$s_code = mb_substr(hash("whirlpool", $s_name.time()),0,8);
i potem pole UNIQUE w bazie i jak coś to aplikacja wywala uknown error, sprobuj ponownie;)SM-S908
- A nie lepiej po prostu użyć jakiejś odmiany Base64? , Rhobaak 9/08/10 10:34
...Kor2dual3,2hZ overkloc,4Gbit Ram
G-forc 460 gietex,barakudy
Children of Neostrada Association MVP - pamiętam, że próbowałem i z jakiegoś powodu , kubazzz 9/08/10 13:10
to się nie nadawało.
ale już nie pamiętam dlaczego.SM-S908 - już wiem , kubazzz 9/08/10 13:55
przy BASE64 wychodzi dłuższy ciąg znaków, więc zły wektor zmian;)SM-S908 - Jak może wychodzić dłuższy, skoro szesnastkowo jeden znak to 4b, a w Base64 - 6b?:) , Rhobaak 9/08/10 14:28
Zapewne przy poprzednich próbach konwertowałeś na Base64 tekstowo zamiast binarnie i dlatego ciąg się wydłużał.Kor2dual3,2hZ overkloc,4Gbit Ram
G-forc 460 gietex,barakudy
Children of Neostrada Association MVP - Dokładnie , pachura 9/08/10 14:51
Dodaj parametr $raw_output = TRUE przy wywolaniu funkcji md5().
- Odp. Systemy Pozycyjne , pachura 9/08/10 14:56
Oczywiscie ze sie da. Tak jak przy kazdym innym systemie - tu przyklad dla szesnastkowego:
x = zadana_liczba
cyfry = '0123456789ABCDEF'
wynik = ''
while x > 0
wynik = wynik . cyfry[x % 16] <--- reszta z dzielenia
x = floor(x / 16)
end while
Problemem jest to ze x musi byc liczba na ktorej mozesz wykonywac operacje dzielenia i modulo. MD5 ma 32 bajty, a typ int w PHP zaledwie 32 bity, wiec kicha.- i nie ma na to obejścia? , kubazzz 9/08/10 18:09
za cienki na to jestem chyba jednak:PSM-S908 - Obejście zawsze jest, pytanie tylko, czy warto aż tak kombinować. , Rhobaak 9/08/10 18:33
Są algorytmy do efektywnego wykonywania działań na dużych liczbach (np. algorytm Karatsuby), ale w tym wypadku to chyba sztuka dla sztuki.Kor2dual3,2hZ overkloc,4Gbit Ram
G-forc 460 gietex,barakudy
Children of Neostrada Association MVP - Kuba, naprawdę kombinujesz tam gdzie nie trzeba... Chcesz mieć krótki , Mcmumin 9/08/10 21:34
sensowny i niepowtarzalny hash? Bierzesz microtime w PHP i przepuszczasz przez Adler32 / Crc32 / Crc32b / base64
I tyle.- no już wiem, ale to było tak poza programem , kubazzz 10/08/10 00:09
już się zorientowałem w temacie tak mniej więcej.
Dzięki za porady:)SM-S908 - tylko że BASE64 generuje plusy [+] i ukośniki [/] co narobić może problemów , kubazzz 10/08/10 04:19
i trzeba to wtedy parsować.
a hashe nie wykorzystują wszystkich znaków...
muszę pomarudzić;)SM-S908 - Są różne warianty Base64. - do URLi jest używana odmiana z - i _ zamiast + i /. , Rhobaak 10/08/10 09:22
...Kor2dual3,2hZ overkloc,4Gbit Ram
G-forc 460 gietex,barakudy
Children of Neostrada Association MVP
|
|
|
|
 |
All rights reserved ® Copyright and Design 2001-2025, TwojePC.PL |
 |
|
|
|