Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Jak v PHP vygenerovat string

Pokud jsem četl správně (já to jen tak prolítnul), tak password_hash https://www.php.net/manual/en/function.password-hash.php

PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).
PASSWORD_BCRYPT - Use the CRYPT_BLOWFISH algorithm to create the hash. This will produce a standard crypt() compatible hash using the "$2y$" identifier. The result will always be a 60 character string, or false on failure.

vrací 60 znaků, navíc ořezává to heslo

password

The user's password.
Caution

Using the PASSWORD_BCRYPT as the algorithm, will result in the password parameter being truncated to a maximum length of 72 characters.

takže místo 500 znaků získáš pouze 60, nebo, rekurzivně použito, 3.600 znaků - navíc část z nich nenáhodných a navíc, pokud to aplikuješ mechanicky, tak těch nenáhodných, ba stejných bude víc než prvních 500

---

převod z jedné abecedy do druhé se dá udělat asi tak miliónem způsobů

Já si vybral ten, kde první abecedu beru jako normální písmena, či lépe jim odpovídající pole bytů nějaké délky (jelikož je to všechno uloženo v paměti, tak toto zcela jistě nějak udělat jde)
Toto pole bytů procházím po nibblech https://cs.wikipedia.org/wiki/Nibble, čímž jsem získal "dvakrát tak dlouhé pole s hodnotami 0..F" které je zápisem toho původního řetězce (jako když si uděláš hexa-dump té paměti) a představil si to jako hooodně dlouhé číslo
Načež toto číslo začnu dělit počtem písmen v druhé abecedě Ad (a získávat tak postupně její číslice, prezentované čísly 0..Ad-1)
Ty číslice zapisuju za sebe, až jich je dost, tak mám správně dlouhý řetězec z písmen té druhé abecedy.

---

Jak teď na to koukám, tak jsem se v tom trochu zamotal
https://www.matweb.cz/prevod/

Měl bych na to jít obráceně, vzít celé to strašně dlooouhé číslo a vydělit ho Ad, čímž bych získal jako zbytek poslední znak řetězce, a o něco kratší dlooouhé číslo, které bych zase dělil Ad a získal jako zbytek předposlední znak řetězce, a tak pořád dál a dál. Matematicky jednoduché, výpočetně poněkud náročnější (jako třeba počítat Ad^C a víc)

Takže to mám fakt blbě.

No, dalo by se z toho vybruslit tím, že bych to vstupní číslo rozdělil na nějaké menší shluky (třeba po 7 bytech, protože Ad bude asi tak 127-33=94 klasických ascii znaků, čili něco pod 7 bitů a ze sedmi osmibitových znaků snadno nadělám 8 sedmibitových a něco zbude ) a poctivě celočíselně vydělil ten shluk, celou část bych zapsal a zbytek "přenesl o patro níž, jako dodatečnou nejvyšší číslici" (takže prostě vzít ten zbytek a přidat ho jako nejvyšší byte nad těch dalších 7 a v dalším kroku dělit tu osmici bytů, pokud mi vyjde celočíselná dělitelnost, tak to doplnit "nulama zleva" na 8 cifer a začít dalším shlukem)

Nebylo by to přesné dělení, ale překódovávalo by se to docela rychle a většinou by se využil celý rozsah abecedy A (asi tak každý 8.-9. znak by byl z trochu menší abecedy) - no chtělo by to ještě promyslet za světla a udělat si na to příklad, ale ono by se asi dalo vyhnout i těm slabším znakům, konec konců nepotřebujeme to mít "matematicky správně vydělené" ale "jen nějak rozumně a opakovatelně rozhozené" a aby dva různé podobné vstupy ideálně vedly ke dvěma různým výsledkům.

---

jenom koukám, že než jsem tohle dopsal, tak jsi svoji odpověď doplnil - nevím, jaké jsou limity těch použitých funkcí v těch odkazech, ale pok dost velké a je to dost rychlé, tak by to mělo taky fungovat (respektive jít upravit na tu jeho abecedu)

---

A vlastně jak na to koukám, tak pokud nemá nějaký extra důvod, proč použít tu výstupní abecedu celou a proč mít zrovna přesně C a nikoli jiné blízké číslo, tak klidně na ten výsledek hodit https://cs.wikipedia.org/wiki/Base64 a vystaráno - dostane velká a malá písmena, číslovky a "+ / =" možná by to stačilo taky a jsou na to knihovný všude

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny