Tôi cần triển khai nhanh nhất có thể khi dịch chuyển bit trái của mảng 16 byte trong JavaCard.Thay đổi bit nhanh của mảng byte - khóa con CMAC
Tôi đã thử mã này:
private static final void rotateLeft(final byte[] output, final byte[] input) {
short carry = 0;
short i = (short) 16;
do {
--i;
carry = (short)((input[i] << 1) | carry);
output[i] = (byte)carry;
carry = (short)((carry >> 8) & 1);
} while (i > 0);
}
Bất kỳ ý tưởng làm thế nào để cải thiện performace? Tôi đã suy nghĩ về một số Util.getShort(...)
và Util.setShort(...)
phép thuật, nhưng tôi đã không quản lý để làm cho nó hoạt động nhanh hơn sau đó thực hiện ở trên.
Đây là một phần của tính toán con CMAC subkeys và nó được thực hiện khá thường xuyên, không may. Trong trường hợp bạn biết một số cách nhanh hơn để tính toán các khóa con CMAC (cả hai khóa con trong một vòng lặp hoặc một cái gì đó tương tự), xin vui lòng, cho tôi biết.
Tôi thu thập JavaCard được xen kẽ? Nếu vậy thì tôi khuyên bạn nên xem xét mã byte được tạo ra và tối ưu hóa với tập lệnh có sẵn trong đầu. Ví dụ tôi nghi ngờ ints có thể là thích hợp hơn để quần short, và vòng lặp đó unrolling có thể đạt được bạn một vài chu kỳ. Ngoài ra, tôi nghi ngờ rằng bạn sẽ làm nhiều hơn một phép tính số học chính xác mở rộng để có thể chuyển sang một số nguyên rộng hơn sớm để xử lý nhanh hơn và chuyển đổi lại mảng 8 bit ở cuối. – doynax
@doynax không có 'int' hoặc' long' trong JavaCard ... 'byte' và' short' là tất cả những gì bạn có. – vojta
Xin lỗi về điều đó, âm thanh như một môi trường đặc biệt làm tê liệt. Mặc dù vậy, quan điểm của tôi vẫn đứng vững, theo dõi mã byte được tạo để đảm bảo rằng trình biên dịch không quyết định tạo ra các lệnh 'i2s' không cần thiết trên các kết quả trung gian ngắn-nhưng-không-thực sự. – doynax