Есть небольшой класс на java:
import java.security.SecureRandom;
public class guidGenerator {
private long clockWall;
guidGenerator(long clockWall) {
this.clockWall = clockWall;
}
private void append(final long n, int i, final byte[] array, int n2) {
--i;
while (i >= 0) {
final byte b = (byte)(n >> i * 4 & 0xFL);
final int n3 = n2 / 2;
if (n2 % 2 == 0) {
array[n3] = (byte)(b << 4);
}
else {
array[n3] |= b;
}
--i;
++n2;
}
}
private static long toLong(final byte[] array, int i, final int j) {
final int n = i + j;
if (n <= array.length) {
long n2 = 0L;
while (i < n) {
n2 = (n2 << 8 | ((long)array[i] & 0xFFL));
++i;
}
return n2;
}
final StringBuilder sb = new StringBuilder();
sb.append("(start: ");
sb.append(i);
sb.append("+ count: ");
sb.append(j);
sb.append(") should NOT be larger than bytes.length");
throw new IllegalStateException(sb.toString());
}
public byte[] generateBytes() {
final SecureRandom secureRandom = new SecureRandom();
final long instant = this.clockWall;
final byte[] bytes = new byte[9];
secureRandom.nextBytes(bytes);
final long long1 = toLong(bytes, 0, 6);
final long long2 = toLong(bytes, 6, 3);
final byte[] array = new byte[16];
this.append(0xFFFFFFFFL & instant, 8, array, 0);
this.append(0xFFFL & instant >> 32, 3, array, 8);
this.append(long1, 12, array, 11);
this.append(0L, 1, array, 23);
this.append(1L, 2, array, 24);
this.append(long2, 6, array, 26);
return array;
}
public static String asHexString(final byte[] array) {
final int length = array.length;
final StringBuilder sb = new StringBuilder(length * 2);
for (int i = 0; i < length; ++i) {
sb.append("0123456789abcdef".charAt(array[i] >> 4 & 0xF));
sb.append("0123456789abcdef".charAt(array[i] & 0xF));
}
return sb.toString();
}
public String generateHexString() {
return guidGenerator.asHexString(this.generateBytes());
}
}
Нужно портировать его на php. Вот как я это делаю:
<?php
class guidGenerator {
private $clockWall;
public function __construct() {
$this->clockWall = $this->clockWall();
}
// timestamp in ms
private function clockWall() {
return round(microtime(true) * 1000);
}
private function append($n, $i, $array, $n2) {
--$i;
while($i >= 0) {
$b = ((($n >> ($i * 4)) & 0xF));
$n3 = ($n2 / 2);
if (($n2 % 2) == 0) {
$array[$n3] = ($b << 4);
} else {
$array[$n3] |= $b;
}
--$i;
++$n2;
}
}
public static function toLong($array, $i, $j) {
$n = ($i + $j);
if($n <= count($array)) {
$n2 = 0;
while($i < $n) {
$n2 = ((($n2 << 8) | (($array[$i] & 0xFF))));
++$i;
}
return $n2;
}
echo "(start: {$i} + count: {$j}) should NOT be larger than bytes.length\n";
}
public function generateBytes() {
$instant = $this->clockWall;
$bytes = unpack('C*', random_bytes(9));
$long1 = ebayGuidGenerator::toLong($bytes, 0, 6);
$long2 = ebayGuidGenerator::toLong($bytes, 6, 3);
$array = [];
$this->append((0xFFFFFFFF & $instant), 8, $array, 0);
$this->append((0xFFF & ($instant >> 32)), 3, $array, 8);
$this->append($long1, 12, $array, 11);
$this->append(0, 1, $array, 23);
$this->append(1, 2, $array, 24);
$this->append($long2, 6, $array, 26);
return $array;
}
public static function asHexString($array) {
$length = count($array);
$sb = '';
$hex = '0123456789abcdef';
for($i = 0; $i < $length; ++$i) {
$sb .= $hex{$array[$i] >> 4 & 0xF};
$sb .= $hex{$array[$i] & 0xF};
}
return $sb;
}
public function generateHexString() {
return guidGenerator::asHexString($this->generateBytes());
}
}
Но мой порт почему-то не работает как нужно... Где я допустил ошибку? А то несколько часов уже голову ломаю что не так в моём коде...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть база данных MySQL с большими таблицами (~4-20G) и сервер Tableau для аналитиковЗапросы с Tableau работают слишком медленно
Можно из такой строки: 548673++++++1028 809216 /RU/CARD2CARD ALFA_MOBILE>MOSCOW 3105
Слово следует рассматривать как последовательность, содержащую только буквы (все остальные символы не являются частью слово)Например: Вход: