Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » Liu CAs 12:35
 » mravel 12:35
 » Sherif 12:28
 » zibi13 12:27
 » ulan 12:26
 » PiotrexP 12:15
 » rainy 12:12
 » Wolf 12:10
 » metacom 12:08
 » rooter666 12:06
 » Chrisu 12:06
 » Holyboy 11:58
 » Robek 11:57
 » Magnus 11:50
 » NimnuL 11:44
 » fuzjon 11:41
 » Kenny 11:38
 » emigrus 11:21
 » myszon 11:20
 » ngP 11:11

 Dzisiaj przeczytano
 36904 postów,
 wczoraj 25433

 Szybkie ładowanie
 jest:
włączone.

 
ccc
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

  1. Eeee straszna kombinacja... Masz funkcję mikrotime którą możesz , Mcmumin 9/08/10 10:07
    zrandomować, przepuścić przez MD5, SHA włorewer

    1. 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

      1. ... , 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.

        1. 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

  2. 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

    1. 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

    2. 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

      1. 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

        1. Dokładnie , pachura 9/08/10 14:51
          Dodaj parametr $raw_output = TRUE przy wywolaniu funkcji md5().

  3. 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.

    1. i nie ma na to obejścia? , kubazzz 9/08/10 18:09
      za cienki na to jestem chyba jednak:P

      SM-S908

      1. 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

      2. 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.

        1. 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

        2. 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

          1. 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