PHP-де басылатын жолды шығаратын кеңістікті тиімді кодтаудың көпшілігі?

Менде md5() қолданылған кезде $ string үлкен жолым бар

c4ca4238a0b923820dcc509a6f75849b

Ұзындығы 32, мен оны азайтқым келеді

base64_encode(md5($string, true));

xMpCOKC5I4INzFCab3WEmw==

Соңғы екі == жою, маған ұзындығы = 22 жолды береді.

Басқа жақсы алгоритмдер бар ма?

2
Соңғы жолмен жоспарыңыз қандай? Үлкен жолдарды салыстыру үшін ма? Сонымен, сіз оны бірегей хэшке ие болғыңыз келеді ме?
қосылды автор Hugo Delsing, көзі
@cHao Сіз дұрыссыз. Бұл түсінбеді.
қосылды автор devnull, көзі
Параметр - жолды қысу. Сіз мұнда қалай жетуге тырысып жатырсыз?
қосылды автор devnull, көзі
@Ryan, бұл сіздің «қысқартылған» біреудің түпнұсқасын алуды қалайсыз ба, білу өте маңызды. Егер солай болса, онда md5 - ешқандай өтпеді.
қосылды автор ElmoVanKielmo, көзі
@Gerry, md5 - қайтарылмайтын алгоритм - бұл веб-сайт «оны қайтадан түрлендірмейді» - ол негізінен біреудің «1» мәнін нәтиже md5 сомасымен сақтап, оны сәйкестендірді. Алайда, «1» - мүмкін нәтижелердің бірі ғана. Кез-келген md5 сомасы үшін осы бір мд5 сомасына азайтылған жолдардың шексіз саны бар.
қосылды автор ElmoVanKielmo, көзі
@devnull: Компрессия кездейсоқ көрінетін алты жолды (мысалы, хэш сияқты) көмектеспейді. Оны ашу үшін қажетті ақпарат сақталған байттан асып кетуі мүмкін.
қосылды автор cHao, көзі
Қысқа қаншалықты қысқа?
қосылды автор RandomSeed, көзі
Жалпы алғанда, алфавитті неғұрлым көп болса, сіз кодты кодтау үшін қажетті аз таңбаларды пайдалануға рұқсат етілген. Сіз қандай алфавиттік өлшемді пайдалануға болатынын айта аласыз.
қосылды автор James K Polk, көзі
Біз, ең жақсы жауапты қамтамасыз ету үшін нақты не істеуге тырысатыныңыз туралы нақты ақпарат қажет.
қосылды автор Nick, көзі
Ең ықтимал хэш мәні ықтимал көшірмесі
қосылды автор Potherca, көзі
Оны бұрынғы md5 жолына «1» түрлендіруге болады. md5.gromweb.com/?md5=c4ca4238a0b923820dcc509a6f75849b . Бұл азаяды; Немесе сіз бізге не істеуге тырысатын болсаңыз, біз сіздерге түбегейлі мәселені шешетін шешімді бере аламыз.
қосылды автор Gerry, көзі
@ElmoVanKielmo Мен білемін, ол шын мәнінде шешуге тырысатыны туралы көбірек ақпарат қажет екеніне көз жеткіздім.
қосылды автор Gerry, көзі

8 жауаптар

md5 - бұл хэш функциясы және сондықтан қайтарылмайтын екенін түсінгеніңізге сенімдімін. Егер сіз қайтымсыздықты ойласаңыз, сіз md5 хешін (немесе кез келген хешіңізді *) таңбалардың ерікті санына дейін түзете аласыз. Мұның бәрі соқтығысу ықтималдығын арттырады (бұл сезінеді , бұл біркелкі таралуды тудырмайды).

Егер сіз қайтымды (яғни бұзбайтын) қысуды іздесеңіз, онда дөңгелекті қайта ойлап таппаңыз. gzdeflate() сияқты кірістірілген функцияларды пайдаланыңыз. немесе gzcompress() немесе Басқа ұқсас функциялар .


*Here is a list of hash functions (wikipedia) along with the size of their output. I suppose the smallest possible "hash function" would be a parity bit :)

3
қосылды

The smaller the length of the string you want .. the smaller the number of possible combination

Беделі бар мүмкіндіктердің жалпы саны

Жалпы мүмкіндігі = n r

Себебі, біз base64 -ге қатысты басып шығарылатын өнімге ие болғандықтан, бізде тек 64 таңба ғана бар

 n = 64 

Егер сіз ұзындығы 22 әріпке қарап отырсаңыз

r <64> 22 = 5,444,517,870,735,015,415,413,993,718,908,291,383,296 мүмкіндіктері

Back to your question : Are there any better algorithm?

Жолды жақсы қыл-қыбырмен қалаған ұзындыққа дейін жеткізіңіз, өйткені жалпы мүмкіндік және соқтығысу бекітілген

$string = "the fox jumps over the lazy brown dog";
echo truncateHash($string, 8);

Шығару

9TWbFjOl

Қолданылған функция

function truncateHash($str, $length) {
    $hash = hash("sha256", $str, true);
    return substr(base64_encode($hash), 0, $length);
} 
2
қосылды

Екіншіден он алтылыққа (md5 ретінде) түрлендірудің орнына, содан кейін жолын 64-негізіне түрлендірудің орнына, он алтылықты md5-ден тікелей base64 түрлендіруге болады.

Он алтылық сандар әр таңба үшін 16 бит болғандықтан, base64 әр таңба үшін 64 биттен тұрады, әрбір 2 оналтылық таңбаны бір базалық 64 таңба құрайды.

Конверсияны орындау үшін келесі әрекеттерді орындауға болады:

  • Split the string into sixteen 2 character chunks
  • The first character should be multiplied by 2 and added to the second (keeping in mind that A-F = 10-15).
  • This number can be matched to the base64 scheme using the table from here: https://en.wikipedia.org/wiki/Base64

Бұл md5 жолының он алтылық көрінісі сияқты бірдей мәнге ие 16 таңбалы base64 жолына әкеледі.

Теориялық тұрғыдан, кез-келген база үшін де солай ете аласыз. Егер бізде base128 жолын ASCII кодтау әдісі болса, біз 8 таңбалық жолмен аяқталуымыз мүмкін. Дегенмен, таңбалар жиыны шектеулі болғандықтан, base64 әдетте пайдаланылатын ең жоғары база деп санаймын.

2
қосылды
Ең оңай жолы: md5() екінші дәлел ретінде true параметрін шикі шығаруды қайтару үшін жіберіңіз.
қосылды автор duskwuff, көзі

MD5 сіз үшін дұрыс таңдау болып табылатынын білмейсіз, бірақ сіз бұл алгоритммен ұстануға және қысқа ұсынуды іздеуге негіз бар деп есептеймін. Әр түрлі алфавиттері бар қысқа жолды жасау үшін бірнеше мүмкіндіктер бар:

1-нұсқа: екілік жол

MD5-дің қысқа possbile нысаны - бұл екілік көрініс, ол жай ғана қоңырау шалуға болады:

$binaryMd5 = md5($input, true);

Дерекқорда кез-келген басқа жол сияқты сақтауға болатын бұл жолда тек 16 таңба қажет. Тек mysqli_real_escape_string() немесе параметрленген сұраулармен (PDO) бірге тиісті түрде қашып кетуіңізге көз жеткізіңіз.

2-нұсқа: Base64 кодтауы

Base64 кодтауы осы алфавитпен жолды шығарады: [0-9 A-Z a-z + /] және '=' толтырғыш ретінде пайдаланады. Бұл кодтау өте жылдам, бірақ кейде қажетсіз кейіпкерлерді қамтиды '+/='.

$base64Md5 = base64_encode(md5($input, true));

Шығарылым ұзындығы MD5 хэш үшін әрқашан 24 таңба болады.

3-параметр: Base62 кодтау

Base62 кодтауы тек алфавитті пайдаланады [0-9 A-Z a-z]. Мұндай жолдарды URL мекенжайындағы белгілер сияқты кез келген мақсатта қауіпсіз пайдалануға болады және олар өте ықшам. Екілік жолдарды base62 алфавитіне түрлендіруге қабілетті base62 энкодерлері жаздым . Бұл мүмкін болатын ең жылдам іске аспауы мүмкін, бірақ түсінікті кодты жазудың мақсаты болды. Сол класс түрлі алфавиттерге оңай бейімделуі мүмкін.

$base62Md5 = StoBase62Encoder::base62encode(md5($input, true));

Шығарылым ұзындығы MD5 хеші үшін 16-дан 22 таңбадан ауытқиды.

1
қосылды

Бұл кодтау қысқа жолды жасайды,

print base64_encode(hash("crc32b",$string,1));

шығу

qfQIdw==
0
қосылды
сондықтан кез келген ± 2 ^ 32 жолдары соқтығысады. Маған ұнайтын күш ...
қосылды автор bwoebi, көзі
@bwoebi ол мұндай хэшті қолданғысы келетін ОП-ға байланысты, бірақ бұл жағдайда бұл хештің ұзындығы маңызды. Қауіпсіздік мәселелеріне келсек, sha256 және sha512 md5
қосылды автор Сухой27, көзі
@duskwuff md5 сондай-ақ, қайтымсыз түрлендіру болып табылады, олар hashing algorithms
қосылды автор Сухой27, көзі
CRC32 - бұл қайтымсыз өзгеріс. Сіз сондай-ақ хэшті қысқарта аласыз.
қосылды автор duskwuff, көзі

Мен сіздің постыңыздан хэшинг алгоритмін іздейтін және қыспағандықтан оқыдым.

Мұнда php-те әртүрлі стандартты хэширлеу алгоритмдері бар. PHP қараңыз hashing функциялары . Сізге хэштің қалағанына қарай әртүрлі тәсілдер бар. Сақ болыңыз және орташа соқтығысу ықтималдығын есептеңіз.

Дегенмен, сіз «қысуды» іздейтін сияқты, ол белгілі бір жолдың ең аз мүмкін өлшемін шығарады. Егер сіз жасасаңыз, Lempel-Ziv- Welch ( PHP іске асыру ) немесе others .

0
қосылды

Base 91 looks like the most space efficient binary to ASCII printable encoding algorithm (which is what it seems you want).

Мен PHP-ны іске асыруды көрген жоқпын, бірақ сіздің бағдарламалық жасақтамаңыз басқалармен жұмыс істеуі керек болса, мен Base 64-ке қосыламын; бұл белгілі, найзағай жылдам және барлық жерде қол жетімді.

0
қосылды

Біріншіден, сіздің сұрағыңызға жауап беру үшін: Ия, әлдеқайда жақсы алгоритм бар («жақсы» деген сөз «қысқа» дегенді білдіреді).

hash() функциясын қолданыңыз (ол PHP 5.1.2 нұсқасынан бастап, PHP ядросының бөлігі болып табылады және adler32 , fnv132 , crc32 , crc32b , fnv132 немесе joaat алгоритмдері.

Сіздің қазіргі жағдайыңыз туралы тереңірек білмей-ақ, сіз өзіңіз ойлағандай таңдай аласыз, бұл ең керемет.

Міне мысал:

hash('crc32b', $string)

Интернеттегі мысал мүмкіндігімен бірге ойнай аламын.

Екіншіден, сіз сұрайтын нәрсені стекаoverflow-дегі басқа сұрақтың дәлме-дәл дубликаты деп атап өткім келеді .

0
қосылды