Jump to content
php.lv forumi

No lielāka teksta blāķu, pārvērst uz īsāku unikālu id.


Wuu

Recommended Posts

Ir kāds labs veids, kā lielu teksta blāķi saspiest, pēc iespējas unikālākā [a-z] simbolu virknē?

 

Pagaidām ir ideja, katru burtu pār-konvertēt uz ascii. Sasummēt, un rezultātu pa vienam ciparam atpakaļ ascii + sāli (a.k. kopējais teksta garums)

const result = String([...text.replace(/\s/, '')].reduce((all, val) => all / 2 + val.charCodeAt(), '')).replace(/\./, '').split('')
.map(val => String.fromCharCode(97 + Number(val)))
.join('')

Pagaidu variantā tiek izmantoti tikai 10 simboli.

 

Vēl viens variants, ar gatavu ascii tabulu, no kuras paņemt vajadzīgo simbolu virkni.

const ascii = [45, 95, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122]

const result = `${[...text].reduce((all, val) => all / 2 + val.charCodeAt(), 0)}${text.length}`
	.match(/(1\d{1,2})|(\d{1,2})/g)
	.map(val => ascii.indexOf(val) === -1 ? String.fromCharCode(ascii[val % ascii.length]) : String.fromCharCode(val))
	.join('')
Edited by Wuu
Link to comment
Share on other sites

String.prototype.hashCode = function(){
	var hash = 0;
	if (this.length == 0) return hash;
	for (i = 0; i < this.length; i++) {
		char = this.charCodeAt(i);
		hash = ((hash<<5)-hash)+char;
		hash = hash & hash; // Convert to 32bit integer
	}
	return hash;
}
 

+

http://hashids.org/

Edited by Blitz
Link to comment
Share on other sites

Ideja "teksta blāķi" pārveidot masīvā ar simboliem, lai to apstrādātu, neizskatās īpaši pievilcīga + tas FP kods ir absolūti nelasāms.

Ja tu šitādu murgu uzrakstītu manis pārraudzītā projektā, tu izlidotu, acis nepamirkšķinot, ja vien tev nebūtu pietiekami ticama atruna, ka to izdarīji, lai izjokotu kādu kolēģi.

Edited by codez
Link to comment
Share on other sites


'use strict';

 

const crypto = require('crypto'),

h = crypto.createHash('md5'),

chars = [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],

bigInt = require('big-integer');

 

h.update('test trololo', 'utf8');

 

let b = bigInt(h.digest('hex'), 16),

res = '';

 

while(!b.isZero()) {

const {quotient: q, remainder: r} = b.divmod(chars.length);

res += chars[r.toString()];

b = q;

}

 

console.log(res);

Link to comment
Share on other sites

Es laikam izmantotu kādu no standartā gandrīz vienmēr pieejamajiem esošajiem hešošanas algoritmiem md5() sha1() crc32() vai arī kādu no saraksta
http://lv.php.net/manual/en/function.hash-algos.php
Ja nav vajadzības, lai algoritms būtu ar kriptogrāfijai nepieciešamajām īpašībām (piemēram, nav svarīgi, lai no rezultāta būtu grūti atrast tādus ievaddatus, kuri dod šādu rezultātu), tad var izmantot arī CRC. Ja nav svarīgi, tad  būtu jāizvairās arī no md5 un sha1.
Pēc  tam iegūtos datus konvertētu no heksadecimālās bāzes uz bāzi, kas satur visus burtus:
http://lv.php.net/manual/en/function.base-convert.php
(ja neder, ka satur ciparus, tad var izmantot šo piemēru: http://lv.php.net/manual/en/function.base-convert.php#106546 )

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...